Изменение направления прокрутки в 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
    }