Изменение направления прокрутки в UICollectionView
У меня есть UICollectionView, который у меня установлен, все работает отлично (выбор, заголовки и т.д.), однако я хочу изменить направление прокрутки в некоторых ситуациях.
Короче, если я войду в панель рассказов и изменим scrollDirection, он отлично работает, но я хочу сделать это программно!
Я попытался изменить направление прокрутки в виде коллекции непосредственно с помощью
[myCollectionView setScrollDirection:....and so on.......
Но это не работает, я не могу найти scrollDirection или подобное там.
Я также попытался настроить раскладку потока, но я уверен, что делаю это неправильно (т.е. пытается установить ViewLayout в FlowLayout).
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
[myCollectionView setCollectionViewLayout:flowLayout];
Это сбой с большим количеством проблем с ограничениями, и я подозреваю, что мне нужно сделать намного больше работы с flowLayout (из того, что я обнаружил, что это немного выше меня прямо сейчас).
Следует также отметить, что я использую пользовательскую ячейку, верхние и нижние колонтитулы.
Короче, есть ли простой способ сделать это или нет? ИЛИ кто-нибудь знает хороший учебник по макету потока?
ИЗМЕНИТЬ
Я настраиваю представление коллекции как таковое;
[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];
Я реализую эти методы делегатов, и все отлично работают
viewForSupplementaryElementOfKind
numberOfSectionsInCollectionView
numberOfItemsInSection
cellForItemAtIndexPath
didSelectItemAtIndexPath
Я добавил DataSource и Delegate в .h, а также делегат FlowLayout, но я не уверен, что я должен иметь для последнего.
Большая часть визуальной компоновки выполняется в Story Board, есть несколько вещей, таких как шрифт, размер и цвет, которые я делаю программно.
ДРУГОЕ ИЗОБРАЖЕНИЕ
Это ошибка, когда я пытаюсь изменить FlowLayout, я также получаю это при попытке и недействительности макета.
Невозможно одновременно удовлетворить ограничениям. Вероятно, хотя бы одно из ограничений в следующем списке - это тот, который вы не хотите. Попробуйте это: (1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете; (2) найти код, который добавил нежелательные ограничения или ограничения и исправить его. (Примечание. Если вы видите NSAutoresizingMaskLayoutConstraints, который вы не понимаете, обратитесь к документации для свойства UIView, переводимой вAutoresizingMaskIntoConstraints)
"<NSAutoresizingMaskLayoutConstraint:0x89967f0 h=--& v=--& V:[menuCell:0x8991700(50)]>",
"<NSLayoutConstraint:0x8991200 menuCell:0x8991700.bottom == UILabel:0x8992be0.bottom + 100>",
"<NSLayoutConstraint:0x898fd50 UILabel:0x8992be0.top == menuCell:0x8991700.top + 3>"
Будет пытаться восстановить, нарушая ограничение
Перерыв на objc_exception_throw, чтобы поймать это в отладчике.
Также могут быть полезны методы в категории UIConstraintBasedLayoutDebugging в списке UIView.
Ответы
Ответ 1
Хорошо, попробуйте вызвать invalidateLayout в вашем представлении коллекции так:
[myCollectionView.collectionViewLayout invalidateLayout];
Это заставляет просмотр коллекции обновлять свой макет в этот момент (См. документацию по железу здесь). Я не уверен, но я не думаю, что это вызвано, когда вы меняете направление прокрутки.
Посмотрите, как это вас доставит!
Ответ 2
сделайте следующее:
- (IBAction)changeDirection:(UIButton *)sender
{
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
{
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
}
else
{
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
}
}
Это работает для меня.
Ответ 3
В быстром режиме вы можете сделать это:
//From the collection view subclass
if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout {
layout.scrollDirection = .Vertical
}