Xamarin iOS。我可以在stackView控件中使用集合视图(作为stackview的项目)吗?

问题描述 投票:0回答:2

我有简单的应用程序,其中包含UICollectionViewController与自定义UICollectionViewCell。控制器放在Mainstoryboard中(我使用原生的xamarin)。我的应用程序有效,但我想在我的集合视图上方添加一个通用的“标题”控件(带有与/ describe集合一起使用的按钮和标签)。我曾预料到,当我已经创建的集合视图位于StackView的底部并且我新创建的“标题”控件位于顶部时,可以通过UIStackView完成。但正如我所看到的,我无法添加我的UICollectionViewController作为Stack view的项目。我认为它可以由TabBarController完成,但它看起来不是一个好主意,特别是如果我有一个更多的潜在控制按钮为我的集合视图。也许有更好的解决方案?有人可以告诉我吗?

ios xamarin collectionview stackview
2个回答
0
投票

你可以创建一个新的UIViewController,在其中放一个UIStackView。然后在UICollectionViewController中初始化你的Storyboard,在StackView中添加它的视图:

UIView headerView = new UIView();
...//Add some items in this view

//Add a height constraint
headerView.AddConstraint(NSLayoutConstraint.Create(headerView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1, 200));
MyStack.AddArrangedSubview(headerView);

MyCollectionView collection = Storyboard.InstantiateViewController("MyCollectionView") as MyCollectionView;
MyStack.AddArrangedSubview(collection.View);

但如果您只想添加标题视图,我建议您使用UICollectionViewHeader

首先,使用下面的事件在CollectionView中创建标题 Source

public override UICollectionReusableView GetViewForSupplementaryElement(UICollectionView collectionView, NSString elementKind, NSIndexPath indexPath)
{

    if (elementKind == "UICollectionElementKindSectionHeader" && indexPath.Section == 0)
    {
        UICollectionReusableView header = collectionView.DequeueReusableSupplementaryView(new NSString("UICollectionElementKindSectionHeader"), "MyHeader", indexPath);

        //Add some items
        //header.AddSubview();

        return header;
    }

    return null;
}

不要忘记注册标题类:CollectionView.RegisterClassForSupplementaryView(typeof(UICollectionReusableView), new NSString("UICollectionElementKindSectionHeader"), "MyHeader");

最后设置Header的高度来显示它:

// This event exists in the UICollectionViewDelegateFlowLayout
public override CGSize GetReferenceSizeForHeader(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
{
    if (section == 0)
    {
        return new CGSize(UIScreen.MainScreen.Bounds.Size.Width, 300);
    }
    return CGSize.Empty;
}

0
投票

您可以通过在故事板中创建UICollectionViewUIStackView作为子视图添加到UIViewController,然后将UIStackViewUICollectionView作为子视图拖放到其中。并将视图控制器指定为集合视图的数据源属性对于公共标题控件,您可能想要使用UIView或通过编程方法创建自定义XIB,方法是创建UIView的子类。

所以你的控制器层次结构会是

->UIViewController
    ->UIStackView
        ->UIView
        ->UICollectionView

但是,UIStackView非常适用于您具有复杂视图层次结构的情况,您不必自己处理多个自动布局约束,但它有一些常见问题,您可能需要查看此post

如果不是这种情况,那么您应该使用更简单的方法,只需手动添加约束来布局视图。

© www.soinside.com 2019 - 2024. All rights reserved.