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

时间:2018-03-04 20:43:15

标签: ios xamarin collectionview stackview

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

2 个答案:

答案 0 :(得分: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);

但如果您只想添加标题视图,建议您使用UICollectionView' Header

首先,使用下面的事件在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;
}

答案 1 :(得分:0)

您可以通过在故事板中创建UICollectionView并将UIStackViewUIViewController拖放为子视图,将UIStackView作为子视图添加到UICollectionView在里面。并将View Controller指定为Collection View的数据源属性 对于常见的标题控件,您可能希望使用UIView或通过编程方法创建自定义XIB,方法是创建UIView的子类。

所以您的控制器层次结构将是

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

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

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