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

Я добавил источник данных и делегат .h, а также делегат FlowLayout, но я не уверен, что я также должен иметь для последнего.

большая часть визуального макета выполнена в сюжетной доске, есть несколько такие вещи, как шрифт, размер и цвет, которые я делаю программно.

ЕЩЕ ОДНО РЕДАКТИРОВАНИЕ

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

не удается одновременно удовлетворить ограничений. Вероятно, по крайней мере одно из ограничений в следующем списке-это то, что вам не нужно. Попробуйте следующее: (1) Посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете; (2) Найдите код, который добавил нежелательные ограничения или ограничения и исправить это. (Примечание: Если вы видите NSAutoresizingMaskLayoutConstraints, которые вы не понимаете, обратитесь к документации для свойства UIView translatesAutoresizingMaskIntoConstraints)

"<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, перечисленные в разделе.

3 ответов


Ok, попробуйте вызвать invalidateLayout в представлении коллекции следующим образом:

[myCollectionView.collectionViewLayout invalidateLayout];

это заставляет представление коллекции обновлять свой макет в этой точке (см. документацию apple здесь). Я не уверен, но я не думаю, что это называется, когда вы меняете направление прокрутки.

посмотреть, если это получает вас где-нибудь рядом!


этого:

- (IBAction)changeDirection:(UIButton *)sender
{
     UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
     if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
     {
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
     }
     else
     {
         layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
     }
}

это работает для меня.


в Swift вы можете сделать это:

//From the collection view subclass
    if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.scrollDirection = .Vertical
    }