it-swarm.com.ru

UICollectionView: одна строка или столбец

Я хочу использовать UICollectionView для отображения горизонтального прокручиваемого списка миниатюр, однако я хочу, чтобы это была одна строка. В другом представлении я отображаю миниатюры в UICollectionView, но этот прокручивается вертикально, и он находится в одном столбце.

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

Как сделать так, чтобы UICollectionView отображал одну строку или столбец?

31
William T.

Я предполагаю, что вы используете встроенный Flow Layout. Однако для вашего случая вы должны создать собственный UICollectionView Layout. Сделать его подклассом UICollectionViewFlowLayout и добавить этот код в метод init:

- (id)init {
    if ((self = [super init])) {
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.minimumLineSpacing = 10000.0f;
    }
    return self; 
}

minimumLineSpacing - это ключ к тому, чтобы здесь была одна строка.

Надеюсь, это поможет!

26
Nikola Kirev

Я обнаружил, что установка minimumLineSpacing просто сделала мою область прокрутки действительно большой, а установка minimumInteritemSpacing=big позволила сохранить элементы в одной строке или столбце прокрутки, центрированных по центру collectionview.

12
sidekickr

Нет реальной причины для создания подкласса, если вы можете доверять приведению типов.

((UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout).minimumLineSpacing = 1000.0f;

Если у вас загружен collectionView из пера, вы также можете поиграться с параметрами в Атрибутах и ​​Инспекторах размеров.

То же самое касается направления прокрутки.

9
atreat

Для Swift 3 

let flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.width/2-10, height: 190)
flowLayout.sectionInset = UIEdgeInsetsMake(0, 5, 0, 5)
flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal
flowLayout.minimumInteritemSpacing = 0.0
self.gCollectionView.collectionViewLayout = flowLayout
2
Azhar

Когда вы инициализируете свою UICollectionView, передайте следующую UICollectionViewFlowLayout в параметре init. 

Примечание. Вам не нужно создавать подкласс UICollectionViewFlowLayout

var collectionViewFlowControl = UICollectionViewFlowLayout()
collectionViewFlowControl.scrollDirection = UICollectionViewScrollDirection.Horizontal

Для 0 px Cell Spacing:

collectionViewFlowControl.minimumInteritemSpacing = 0;
collectionViewFlowControl.minimumLineSpacing = 0;

collectionView = UICollectionView(frame: CGRectMake(0, 0, self.view.frame.size.width, 120), collectionViewLayout: collectionViewFlowControl)
2
Ilker Baltaci

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

Итак, вот мое очень простое решение для одного столбца, выровненного по левому краю:

class GCOneColumnLeftAlignedFlowLayout: UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes = super.layoutAttributesForElements(in: rect)

        var y: CGFloat = sectionInset.top
        attributes?.forEach { layoutAttribute in
            layoutAttribute.frame.Origin.x = sectionInset.left
            layoutAttribute.frame.Origin.y = y
            y = y + layoutAttribute.frame.height + minimumLineSpacing
        }

        return attributes
    }
}

вы также должны установить что-то вроде

estimatedItemSize = CGSize(width: 120, height: 40)

Не забудьте убрать строку

minimumLineSpacing = big number

Из других решений.

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

0
Gerd Castan
 UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
 [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

 layout.minimumInteritemSpacing = 0;
 layout.minimumLineSpacing = 0;


 blendEffectCollectionView=[[UICollectionView alloc] initWithFrame:CGRectMake(0, 95, 320, 60) collectionViewLayout:layout];
 [blendEffectCollectionView setDataSource:self];
 [blendEffectCollectionView setDelegate:self];
 [blendEffectCollectionView registerClass:[BlendModeCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
 [blendEffectCollectionView setBackgroundColor:[UIColor clearColor]];

 [bottomActivityView addSubview:blendEffectCollectionView];
0
ajjjjjjjj