2015-11-18 8 views
7

używam cechę układu przepływowego autosizing z CollectionViewJak zrobić collectionViewCell rozmiar automatycznie tylko na wysokość?

self.flow = [[UICollectionViewFlowLayout alloc] init]; 
self.flow.scrollDirection = UICollectionViewScrollDirectionVertical; 
self.flow.sectionInset = UIEdgeInsetsZero; 
self.flow.estimatedItemSize = CGSizeMake(320, 48); 

Chcę komórek wypełni o szerokości pełnej szerokości CollectionView (widthCell = widthCollectionView)

ale mam co autosizing pracy dla całej wielkości. Próbuję grać z Content Compression/Hugging Priority - nie działa.

Przy szerokości CollectionView wynosi 320px, mam rozmiar komórek dla rozmiaru zawartości etykiety.

Cela wygląda enter image description here

Ograniczenia poziomej H: | -8 [IMG (48)] - 8- [etykieta] -8 |

Jak zrobić prace autoSize tylko do pionowego do poziomego, ale nie?

+0

mam słuchawkę, działa dobrze http://stackoverflow.com/a/31604233/3382056 – Mihawk

+0

Mihawk, że nie jest to przykład autoSize. Ten przykład też używam, ale zastanawiam się, czy autosize. –

+0

to rozwiązanie jest dla autolayout – Mihawk

Odpowiedz

10

mogę znaleźć rozwiązanie.

CollectionViewCell ma delegata preferredLayoutAttributesFittingAttributes

Tak, ta funkcja daje u layoutAttributes zbiorach jako estimatedItemSize

Musisz robić dalej (na wysokość)

- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { 
    UICollectionViewLayoutAttributes *attr = [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; //Must be called 
    CGRect frame = attr.frame; 
    frame.size.width = layoutAttributes.size.width; //Key here 
    attr.frame = frame; 
    return attr; 
} 

samej u można zrobić, aby wolą rozmiar, szerokość więc ustaw stałą wysokość (frame.size.height = layoutAttributes.size.height).

Jeśli u po prostu skopiować layoutAttributes i szerokość zmieni, nie będzie efektu!

U musi wywołać Super.

+0

Uratowałem mój dzień!Dzięki! – hyouuu

+0

Jak tego używasz? Gdzie ustawiłeś tego delegata? – RedRoses

3

Właściwie masz rację tutaj jest problem z priorytetu ograniczeń.

Aby rozwiązać ten problem priorytetem wiązania należy zaktualizować imageView Leading priority999 a także label Trailing priorytet 999 albo programowo lub bezpośrednio z interfejsu Builder.

Zaktualizuj priorytet programowo, używając zaimplementowanego KVConstraintExtensionsMaster, aby zaktualizować jakiekolwiek ograniczenie bez IBOutlet reference ograniczenia dotyczącego Autolayout.

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell1" forIndexPath:indexPath]; 

    [cell.imageView changeAppliedConstraintPriority:999 forAttribute:NSLayoutAttributeLeading]; 
    [cell.label changeAppliedConstraintPriority:999 forAttribute:NSLayoutAttributeTrailing]; 

    return cell; 
} 

Po tym Teraz trzeba obliczyć tylko wysokość komórki

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat width = CGRectGetWidth(collectionView.bounds); 
    CGFloat height = /* do here some calculation for height */ 
    return CGSizeMake(width, height);; 
} 
+0

U używać sizeForItemAtIndexPath, ale autoSize to bez obliczeń ręcznych. –

+0

oczywiście autoSize zarówno dla szerokości, jak i dla wysokości, ale chcesz, aby komórki wypełniły się szerokością pełnej szerokości CollectionView (widthCell = widthCollectionView). Więc tutaj szerokość komórki zawsze jest równa kolekcji. –

-1

Dmitry Nelepov „s roztwór w SWIFT.

Swift 4

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { 
    let attr = super.preferredLayoutAttributesFitting(layoutAttributes) 
    var frame = attr.frame 
    frame.size.width = layoutAttributes.size.width //Key here 
    attr.frame = frame 
    return attr 
} 
Powiązane problemy