2015-01-22 8 views
5

Liczba S.O. Pytania pokazać technikę autolayout celu określenia minimalnej wielkości wymaganej przez myślą wymaga, aby spełniać swoje ograniczenia: [header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize]Czy systemLayoutSizeFittingSize: wymagają setNeedsLayout i layoutIfNeeded przed nim?

Przed dokonaniem połączenia systemLayoutSizeFittingSize:, wszystkie przykłady Widziałem wymuszenie aktualizacji układu, tak:

[view setNeedsLayout]; 
[view layoutIfNeeded]; 
CGFloat height = [view systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height; 

Chciałbym wiedzieć, kiedy jest to rzeczywiście konieczne, ponieważ wygląda jak posypane rytuałem: Chciałbym zrozumieć, dlaczego dzwonię, zamiast robić to na szczęście!

Właśnie użyłem systemLayoutSizeFittingSize: w jakimś kodzie, w którym selektywnie aktualizuję widok, który jest tableViewHeader instancji UITableView (nie nagłówek sekcji), a następnie zmieniaj rozmiar. Wydaje się działać dobrze bez dodatkowych połączeń. Mam to w moim viewDidLoad:

{ 
    // Remove the view that we don't want. 
    [self.autoPopulateView removeFromSuperview]; 

    // Resize the table's header view now the unwanted view is removed. 
    UIView *const header = self.tableView.tableHeaderView; 

    // Don't explicitly layout. 
    // [header setNeedsLayout]; 
    // [header layoutIfNeeded]; 

    CGFloat height = [header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height; 
    CGRect frame = header.frame; 
    frame.size.height = height; 
    header.frame = frame; 
} 

Dzięki.

+0

Prowadzę dochodzenie w tej samej sprawie, ale nigdy nie doszedłem do wniosku? Dzięki! – mikywan

+0

:-) Nie! Jestem prawie pewien, że przeczytałem coś pokrewnego, ale nie mogę go teraz znaleźć. Zastanawiałem się nad nagraniem, ale nie jestem pewien, czy tak bardzo mi na tym zależy. Przepraszam. – Benjohn

Odpowiedz

0

Zdecydowanie nie powinno być potrzeby wykonywania żadnej z tych połączeń przed wywołaniem systemLayoutSizeFittingSize. Dopóki wszystkie twoje ograniczenia są na miejscu, nie powinieneś robić niczego innego.

W rzeczywistości wymuszenie wcześniejszego przejścia układu jest potencjalnie szkodliwe z punktu widzenia wydajności i uważam, że jest to nie tylko niepotrzebne, ale wręcz szkodliwe.

0

to na pewno wydaje się layoutIfNeeded to catch-all odpowiedzią widząc niespójności obliczeń wysokości przy użyciu systemLayoutSizeFittingSize - problemem jest to, że wartość jest bardzo trudne do debugowania, gdy jest nieprawidłowe

Z mojego doświadczenia trzeba zadzwonić layoutIfNeeded za każdym razem, gdy widok docelowy zaktualizował ograniczenia w kodzie, na przykład zmieniając stałą, dodając, usuwając wiązanie. Dzwonienie pod numer setNeedsLayout lub setNeedsUpdateConstraints nie działa (wzruszam ramionami)