Xamarin для iOS. Могу ли я использовать представление коллекции внутри элемента управления stackView (как элемент стека)?

У меня есть простое приложение, которое содержит UICollectionViewController с пользовательским UICollectionViewCell. Контроллер размещен в Mainstoryboard (я использую родной xamarin). Мое приложение работает, но я хочу добавить общий элемент управления "header" над представлением моей коллекции (с кнопками и метками, которые будут работать с/описывать коллекцию). Я ожидал, что это может быть сделано UIStackView, когда мое уже созданное представление коллекции будет внизу StackView, а мой недавно созданный элемент управления «заголовок» вверху. Но, как я вижу, я не могу добавить свой UICollectionViewController в качестве элемента Stack view. Я думаю, что это может быть сделано TabBarController, но похоже, что это не очень хорошая идея, особенно если у меня есть более одной потенциальной кнопки управления для просмотра моей коллекции. Может быть, есть лучшее решение? Может ли кто-нибудь посоветовать мне?


person Dmitry Lukyanov    schedule 04.03.2018    source источник


Ответы (2)


Вы можете создать новый 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);

Но если вы хотите добавить только представление заголовка, я рекомендую вам использовать Header UICollectionView.

Во-первых, используйте событие ниже, чтобы создать заголовок в 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");

Наконец, установите высоту заголовка, чтобы показать его:

// 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;
}
person Anonymous    schedule 05.03.2018

Вы можете добавить UICollectionView в качестве подпредставления к UIStackView, создав UIViewController в раскадровке и просто перетащив в него UIStackView и UICollectionView в качестве подпредставления. и назначьте контроллер представления в качестве свойства источника данных представления коллекции. Для общего элемента управления header вы можете создать собственный UIView, используя либо XIB, либо программный подход, создав подкласс UIView.

поэтому ваша иерархия контроллеров будет

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

Тем не менее, UIStackView идеально подходит для ситуации, когда у вас есть сложная иерархия представлений, когда вам не нужно иметь дело с несколькими ограничениями автоматического макета самостоятельно, но у него есть некоторые общие проблемы, которые вы, возможно, захотите посмотреть на этом post.

Если это не так, вам следует использовать более простой подход и просто добавить ограничения вручную для компоновки ваших представлений.

person Fahadsk    schedule 05.03.2018