2011-09-27 12 views
38

Mam niestandardowy UIView, który ma dedykowaną, ręcznie ustawioną ramkę dla orientacji pionowej i poziomej, ponieważ automatyczne maskowanie po prostu nie działa w moim przypadku.Jak wymusić layoutSubviews z UIView.

ustawić tę ramkę w:

- (void)viewWillAppear:(BOOL)animated 

I to działa zgodnie z oczekiwaniami.

Mój problem polega na tym, że moje UIView posiada ponadto subviews, które mają również dedykowaną pozycję dla portretu/krajobrazu.

I umieścić te subviews w:

- (void)layoutSubviews 

Gdybym teraz zostawić viewController w np orientację pionową, obróć do pejzażu na innym viewController, a następnie wróć do tego viewController Widzę, że mój widok został poprawnie zmieniony, ale subviews mojego widoku, które znajdują się w layoutSubviews, nie są jeszcze zmieniane, ale zmieniają się w animowany sposób po widok już się pojawił.

zrobić nic w viewDidAppear a ja już próbowałem dzwoniąc

- (void)layoutIfNeeded 

Jak również:

- (void)setNeedsLayout 

W viewWillAppear, ale nie wydaje się, aby cokolwiek zmienić.

Jakieś pomysły, co robię źle?

Dzięki.

Odpowiedz

76

Miał podobny problem dzisiaj. Rozwiązałem go najpierw dzwoni

  • -setNeedsLayout: Ustaw flagę że widok potrzebuje układ, a potem dzwoni
  • -layoutIfNeeded: natychmiast sprawdzić flagę i - jak to ustawić ręcznie przed - jak layoutSubviews wynik jest nazywany.

nie wiem czy to jest najlepszy sposób, ale działa;)

+1

ta metoda wydaje się działać lepiej niż po prostu wywoływanie self.view.layoutSubviews() –

+0

Wywołanie layoutSubviews będzie używać wszelkich ograniczeń, które ustawiłeś, aby uporządkować subviews. Jeśli to, co robisz, nie używa ograniczeń, musisz ustawić NeedsLayout, a następnie layoutIfNeeded, aby wymusić natychmiast aktualizację układu. – Toby

5

Proponuję ustawienie początkowego ramki w viewDidLoad potem zmienia ramkę widoku dla zmian orientacji w

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

Nie trzeba żadnych wyraźnych animacje w layoutSubviews (nie wiem, czy trzeba było w ogóle, ale to zabrzmiało lubię to), ponieważ wszelkie zmiany w ramkach będą zsynchronizowane z animacją rotacji.

Po wyłączeniu ekranu orientacja powinna być nadal obracana, aby widoki były prawidłowo ustawione po ponownym przejściu z powrotem na ekran.

Polecam również oglądanie WWDC 2010 Session 123 "Building Animated Driven UI", który opisuje to zagadnienie bardziej szczegółowo.

+0

używam willAnimateRotationToInterfaceOrientation do obracania moje poglądy, podczas gdy na ekranie, i to działa dobrze. Nie mam również wyraźnej animacji w layoutSubviews, to jest problem. Nie animuję wyraźnie tych widoków, ale są one animowane. "Gdy poza ekranem orientacja powinna być nadal obracana" .. naprawdę? nigdy nie pracował dla mnie, zawsze musiałem zmienić pozycję w viewWillAppear. Dzięki za podpowiedź z Sesją, obejrzysz tę sesję JAK NAJSZYBCIEJ. – myell0w

-1

Dla mnie to, co jest [self.view setNeedsDisplay] pracował. To wywołuje przerysowanie w całym widoku.Możesz również przerysować wybrany widok, wywołując setNeedsDisplay w danym widoku, co zrobiłem w moim przypadku i działało idealnie.

+0

Powoduje to wywołanie metody 'drawRect:'. –

2

Na szybkich 3 @iOS 10.1

override func viewWillAppear(animated: Bool){ 

    //Doesn`t neeed to call super to work 
    view.setNeedsLayout() 
} 

biegnie doskonałych