У меня есть простое приложение, которое содержит UICollectionViewController
с пользовательским UICollectionViewCell
. Контроллер размещен в Mainstoryboard (я использую родной xamarin). Мое приложение работает, но я хочу добавить общий элемент управления "header" над представлением моей коллекции (с кнопками и метками, которые будут работать с/описывать коллекцию). Я ожидал, что это может быть сделано UIStackView
, когда мое уже созданное представление коллекции будет внизу StackView, а мой недавно созданный элемент управления «заголовок» вверху. Но, как я вижу, я не могу добавить свой UICollectionViewController
в качестве элемента Stack view
. Я думаю, что это может быть сделано TabBarController
, но похоже, что это не очень хорошая идея, особенно если у меня есть более одной потенциальной кнопки управления для просмотра моей коллекции. Может быть, есть лучшее решение? Может ли кто-нибудь посоветовать мне?
Xamarin для iOS. Могу ли я использовать представление коллекции внутри элемента управления stackView (как элемент стека)?
Ответы (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
.
Во-первых, используйте событие ниже, чтобы создать заголовок в CollectionViewSource
:
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;
}
Вы можете добавить UICollectionView
в качестве подпредставления к UIStackView
, создав UIViewController
в раскадровке и просто перетащив в него UIStackView
и UICollectionView
в качестве подпредставления. и назначьте контроллер представления в качестве свойства источника данных представления коллекции. Для общего элемента управления header вы можете создать собственный UIView
, используя либо XIB
, либо программный подход, создав подкласс UIView
.
поэтому ваша иерархия контроллеров будет
->UIViewController
->UIStackView
->UIView
->UICollectionView
Тем не менее, UIStackView
идеально подходит для ситуации, когда у вас есть сложная иерархия представлений, когда вам не нужно иметь дело с несколькими ограничениями автоматического макета самостоятельно, но у него есть некоторые общие проблемы, которые вы, возможно, захотите посмотреть на этом post.
Если это не так, вам следует использовать более простой подход и просто добавить ограничения вручную для компоновки ваших представлений.