Как центрировать ячейки UICollectionView по горизонтали и вертикали?

Как вертикально и горизонтально центрировать все ячейки в UICollectionView с помощью UICollectionViewFlowLayout?

Макет Flow оставляет интервал справа или снизу в зависимости от направления прокрутки. Я хочу установить одинаковые отступы со всех сторон. Я поиграл со свойством sectionInset объекта UICollectionViewFlowLayout.


person jjxtra    schedule 12.03.2013    source источник
comment
столкнувшись с той же проблемой, можете ли вы предоставить какой-нибудь код?   -  person kirti Chavda    schedule 10.07.2017
comment
@kirtimali Я только что написал собственный UIView, так как мне нужна была сетка с каждым элементом одинакового размера. Было всего несколько страниц кода. Но не могу поделиться, извините.   -  person jjxtra    schedule 10.07.2017


Ответы (3)


Я бы предложил реализовать протокол UICollectionViewDelegateFlowLayout для динамического достижения горизонтального и вертикального центрирования ваших ячеек. Из Справочника по протоколу UICollectionViewDelegateFlowLayout:

Протокол UICollectionViewDelegateFlowLayout определяет методы, которые позволяют вам координировать свои действия с объектом UICollectionViewFlowLayout для реализации макета на основе сетки. Методы этого протокола определяют размер элементов и расстояние между элементами в сетке.

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

Объект макета потока ожидает, что объект делегата представления набора примет этот протокол. Поэтому реализуйте этот протокол для объекта, назначенного свойству делегата вашего представления коллекции.

Вас, вероятно, больше всего заинтересует метод collectionView:layout:insetForSectionAtIndex:, который можно использовать для настройки вставки со всех четырех сторон экрана с помощью чего-то вроде UIEdgeInsetsMake. Вы можете определить вставки в соответствии с размером экрана, вычитая соответствующую сумму, например размер ячеек, из соответствующего размера экрана (по вертикали или горизонтали). Затем разделите на два, чтобы получить равные вставки для определенного измерения.

person Daniel Zhang    schedule 12.03.2013

Используемая вставка раздела?

Хорошо, попробуйте поиграть со свойством minimumLineSpacing и свойством minimumInteritemSpacing

минимальный межстрочный интервал

Для сетки с вертикальной прокруткой этот межстрочный интервал представляет собой минимальное расстояние между последовательными строками. Для сетки с горизонтальной прокруткой это значение представляет собой минимальное расстояние между последовательными столбцами. Этот интервал не применяется к пространству между заголовком и первой строкой или между последней строкой и нижним колонтитулом.

минимальный межэлементный интервал

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

person Charan    schedule 12.03.2013
comment
Хотя это не полностью решает вопрос, это хороший намек. Спасибо! - person Cesare; 03.05.2015

Подкласс UICollectionViewFlowLayout и переопределите метод layoutAttributesForElementsInRect:, чтобы выровнять UICollectionViewCells:

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {

NSArray* array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;

for(UICollectionViewLayoutAttributes* attributes in array) {

    if(CGRectIntersectsRect(attributes.frame, rect)){

        CGFloat d = UIInterfaceOrientationIsPortrait(_orientation)?
        CGRectGetMidY(visibleRect)-attributes.center.y :
        CGRectGetMidX(visibleRect)-attributes.center.x;

        CGFloat w = visibleRect.size.width;
        CGFloat h = visibleRect.size.height;

        CGFloat dRatio = UIInterfaceOrientationIsPortrait(_orientation)? d/(h/2) : d/(w/2);

        CGFloat angle = MAX_ANGLE*dRatio; // an angle between 0 and MAX_ANGLE based on proximity to center
        CGFloat radians = DEGREES_TO_RADIANS(angle);

        debug = 0;

        CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
        rotationAndPerspectiveTransform.m34 = PERSPECTIVE;

        rotationAndPerspectiveTransform = UIInterfaceOrientationIsPortrait(_orientation)?
        CATransform3DRotate(rotationAndPerspectiveTransform, radians, 1.0f, 0.0f, 0.0f) :
        CATransform3DRotate(rotationAndPerspectiveTransform, radians, 0.0f, 1.0f, 0.0f);

        attributes.transform3D = rotationAndPerspectiveTransform;
    }
}

return array;
}

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

person Lee Probert    schedule 12.03.2013