Как да центрирам клетките на UICollectionView хоризонтално и вертикално?

Как да центрирам вертикално и хоризонтално всички клетки в UICollectionView с помощта на UICollectionViewFlowLayout?

Оформлението на потока оставя разстояние отдясно или отдолу в зависимост от посоката на превъртане. Искам да задам еднакви подложки от всички страни. Играх си със свойството 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

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;
}

Не съм редактирал този код за вас и има препратки към макроси и променливи на екземпляри, така че ще трябва да го промените, за да правите това, което искате. Това беше използвано за създаване на оформление в стил coverflow, но принципите ще бъдат същите за вас, но без 3D бизнеса. Трябва да зададете вмъкването на секцията, за да гарантирате един ред или колона във вашия поток.

person Lee Probert    schedule 12.03.2013