Odpowiedź jest [view layoutIfNeeded]
.
Dlatego:
Wciąż uzyskujesz aktualną szerokość i wysokość widoku, sprawdzając view.bounds.size.width
i view.bounds.size.height
(lub ramkę, która jest równoważna, chyba że grasz z view.transform
).
Jeśli chcesz mieć szerokość i wysokość sugerowaną przez istniejące ograniczenia, odpowiedzią nie jest ręczne sprawdzanie ograniczeń, ponieważ wymagałoby to ponownego zaimplementowania całej logiki rozwiązywania ograniczeń systemu automatycznego układu w celu ich zinterpretowania. ograniczenia. Zamiast tego powinieneś po prostu poprosić auto layout o zaktualizowanie tego układu , tak aby rozwiązał on ograniczenia i zaktualizował wartość view.bounds z poprawnym rozwiązaniem, a następnie sprawdzisz view.bounds.
Jak poprosić automatyczny układ o aktualizację układu? Zadzwoń, [view setNeedsLayout]
jeśli chcesz, aby automatyczny układ zaktualizował układ na następnym zakręcie pętli uruchamiania.
Jednakże, jeśli chcesz, aby natychmiast zaktualizować układ, dzięki czemu można natychmiast uzyskać dostęp do nowych granic cenią później w ciągu bieżącej funkcji, lub w innym miejscu przed przełomie pętli biegu, to trzeba zadzwonić [view setNeedsLayout]
i [view layoutIfNeeded]
.
Zadałeś drugie pytanie: „Jak mogę zmienić ograniczenie wysokości / szerokości, jeśli nie mam do niego bezpośredniego odniesienia?”.
Jeśli tworzysz ograniczenie w IB, najlepszym rozwiązaniem jest utworzenie IBOutlet w kontrolerze widoku lub widoku, aby mieć do niego bezpośrednie odniesienie. Jeśli utworzyłeś ograniczenie w kodzie, powinieneś trzymać odwołanie w wewnętrznej słabej właściwości w czasie, gdy je tworzyłeś. Jeśli ktoś inny utworzył ograniczenie, musisz je znaleźć, sprawdzając właściwość review.constraints w widoku i prawdopodobnie całą hierarchię widoków oraz implementując logikę, która znajduje kluczowe NSLayoutConstraint. Jest to prawdopodobnie niewłaściwa droga, ponieważ wymaga również skutecznego określenia, które konkretne ograniczenie określa rozmiar granic, podczas gdy nie ma gwarancji, że będzie prosta odpowiedź na to pytanie. Ostateczna wartość ograniczeń może być rozwiązaniem bardzo skomplikowanego systemu wielu ograniczeń,