2013-03-12 4 views
8

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

Распределение потока выходит на расстояние справа или снизу в зависимости от направления прокрутки. Я хочу установить одинаковое дополнение со всех сторон. Я играл с sectionInset недвижимостью UICollectionViewFlowLayout.

+0

Обращаясь к одной и той же проблеме, вы можете указать код? –

+0

@kirtimali Я просто написал пользовательский UIView, так как мне нужна сетка с каждым элементом того же размера. Было всего несколько страниц кода. Не могу поделиться им, извините. – jjxtra

ответ

1

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

Хорошо, попытайтесь играть с minimumLineSpacing собственности и minimumInteritemSpacing собственностью

minimumLineSpacing

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

minimumInteritemSpacing

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

+0

Хотя это не полностью решает вопрос, это хороший намек. Спасибо! – Cesare

5

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

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

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

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

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

-1

Подкласс 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-бизнеса. Вам нужно установить вставку раздела, чтобы гарантировать, что в потоке будет одна строка или столбец.

Смежные вопросы