2016-09-14 19 views
5

Przed iOS 10 miałem samokodujący widok tabeli, który składał się wyłącznie z UICollectionView z samokwającymi się komórkami przy użyciu standardowego UICollectionViewFlowLayout. Komórki widoku kolekcji są sortowane za pomocą automatycznego układu. Aby komórka tabeli poprawiła się poprawnie, musiałem znaleźć rozmiar zawartości widoku kolekcji i użyć go w systemie tableLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority :.collectionViewContentSize w iOS 10 przy użyciu komórek samokonujących

Stwierdziłem również, że wywołanie metody collectionView.collectionViewLayout.collectionViewContentSize użyło parametru szacunkowej wielkości wymiaru zamiast rozmiarów komórek o prawidłowym rozmiarze, chyba że wywołałem collectionView layoutIfNeeded. Spowodowało to systemLayoutSizeFittingSize z:

- (CGSize) systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority 
{ 
    self.collectionView.frame = CGRectMake(0, 0, targetSize.width, FLT_MAX); 
    [self.collectionView layoutIfNeeded]; 

    CGSize collectionViewContentSize = self.collectionView.collectionViewLayout.collectionViewContentSize; 
    CGFloat verticalPadding = fabs(self.collectionViewTopPaddingConstraint.constant) + fabs(self.collectionViewBottomPaddingConstraint.constant); 
    CGSize cellSize = CGSizeMake(collectionViewContentSize.width, collectionViewContentSize.height + verticalPadding); 

    return cellSize; 
} 

Wezwanie do layoutIfNeeded teraz powoduje *** Assertion failure in -[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:invalidationContext:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UIFlowLayoutSupport.m:823

jestem naruszono pewne reguły etyczne dzwoniąc layoutIfNeeded ciągu systemLayoutSizeFittingSize? Czy istnieje lepsza metoda obliczania rozmiaru zawartości widoku kolekcji przy korzystaniu z samokierowania komórek? Raczej nie będę musiał przechodzić z układu automatycznego do wykonywania obliczeń wielkości w kodzie, ale z pewnością jest to opcja najgorszego przypadku.

Odpowiedz

1

Mam taki sam problem podczas rozwijania mojej aplikacji na iOS 10. Usuń pierwszą linię rozwiązałem mój problem.

self.collectionView.frame = CGRectMake(0, 0, targetSize.width, FLT_MAX); //Remove this

Nadzieja to pomaga!

+0

Bez ustawienia ramki o odpowiedniej szerokości, rozmiar układu jest błędnie obliczony. Nie ulega awarii, ale rozmiar jest całkowicie błędny. Skończyło się na zastąpieniu widoków kolekcji niestandardową podklasą UIView siatki, ponieważ obliczenia układu były względnie proste, a samokwazyjne widoki kolekcji znajdowały się gdzieś pomiędzy delikatnymi i nieużytecznymi. – ManicJason

+1

Czy próbowałeś wywołać '[self.collectionView.superView layoutIfNeeded];' – tuantm

+0

Powoduje to inny błąd asercji w widoku kolekcji. – ManicJason

12

To dziwny błąd w iOS10 tylko z urządzeniami iPhone Plus. Mam wobec tego samego problemu, moje rozwiązanie było zadzwonić layoutIfNeeded takiego:

func numberOfSections(in collectionView: UICollectionView) -> Int { 
    collectionView.layoutIfNeeded() // Patch: only to solve UIKit crash on Plus models 
    return 1 
} 

robi to samo w różnych UICollectionViewDataSources metody będzie działać jak dobrze

+1

święty dobroć, byłbym "head() -> Desk'. Nie chcę wiedzieć, jak natknąłeś się na to. – Stan

+1

Najdziwniejszy błąd jaki kiedykolwiek spotkałem, miałem awarie produkcyjne jak szalone ... – orxelm

+0

Jesteś zbawicielem! Zrobiło to również dla mnie. –

1

w moim przypadku, nazywając invalidateLayout zanim układ jest obejście tego problemu.

W UIViewController podklasy:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    collectionView.collectionViewLayout.invalidateLayout() 
} 

lub w UIView podklasy:

override func layoutSubviews() { 
    super.layoutSubviews() 
    collectionView.collectionViewLayout.invalidateLayout() 
} 
0

Mam ten sam problem, gdy rozwijać swoją aplikację na iOS 10 i ustawić UICollectionViewDataSource sobie na awakeFromNib, jak to :

override func awakeFromNib() { 
    super.awakeFromNib() 
    let layout = UICollectionViewFlowLayout() 
    // set your layout 
    collectionViewLayout = layout 
    // set dataSource equal to self in here cause a crash 
    dataSource = self 
} 

następnie przenieść kod UICollectionViewDataSource ustawień do layoutSubviews, problem rozwiązany, tak:

override func layoutSubviews() { 
     super.layoutSubviews() 
     dataSource = self 
    } 

override func awakeFromNib() { 
    super.awakeFromNib() 
    let layout = UICollectionViewFlowLayout() 
    // set your layout 
    collectionViewLayout = layout 
    // set dataSource equal to self in here cause a crash 
    dataSource = self 
} 

nadzieję, że to pomaga!

Powiązane problemy