2011-09-11 7 views
5

Moje subviews mają inny układ w orientacji pionowej i poziomej. Układ jest oparty na ramce superview i nie jest trywialny (nie można go osiągnąć za pomocą automatycznych sprężyn i rozpórek).Uzyskiwanie prawidłowej ramki wewnątrz willRotateToInterfaceOrientation

Problem polega na tym, że jeśli zmieniam ramkę subViews podczas willRotateToInterfaceOrientation, animacja jest prawidłowa, ale ramka jest superView jest nadal ramką ze starej orientacji.

Jeśli zmieniam subViews podczas didRotateFromInterfaceOrientation, ramka jest superView jest rzeczywiście poprawna, ale zmiana ramki występuje tylko po animacji obracania i nie wygląda dobrze.

Jaki jest poprawny sposób zmiany ramek subViews podczas zmiany orientacji?

+0

Rozwiązałem ten problem, pisząc metodę w każdym wydziale, który będzie obsługiwał część zmiany ramki. Ustawię ramkę widoku rodzica w willRotateToInterfaceOrientation, a następnie wygeneruję nową podobną ramkę za pomocą funkcji CGFrameMake i przekaż ją do każdego subView. To zadziałało dla mnie .... sprawdź czy to jest pomocne. – Mohammad

+0

Nie bardzo rozumiem twoją odpowiedź. W willRotateToInterface wciąż nie znam ramki superView, ponieważ rotacja jeszcze się nie wydarzyła. To jest problem. – adamsiton

+0

Nie używam ramki superView do obracania subviews. Obliczyłem, jaka byłaby wartość ramki superView po obrocie, a następnie wykonam nowy CGRect na podstawie obliczeń, a następnie przekażę go do metody OperationOrientation każdego subView. Jeśli nie jesteś w stanie obliczyć, jaka byłaby wartość ramki superView po obrocie, powyższe nie zadziała. – Mohammad

Odpowiedz

3

Myślę, że możesz spróbować przesłonić layoutSubviews. Tam możesz układać subviews zgodnie z bieżącą orientacją, bez zawracania sobie głowy z powodu/nie RotateFromInterfaceOrientation. layoutSubviews jest wywoływana za każdym razem, gdy widoki są ułożone. Pomoże Ci to w ustawieniu czasu zmiany klatki wraz z animacją.

HTH,

Akshay

+0

Ale będzie to oznaczać, że przenoszę całą logikę układu do widoku, a nie ViewController. Obecnie ustawiam układ subView zgodnie z właściwościami UIViewController. Przeniesienie logiki do UIView oznacza, że ​​muszę podklasę UIView i przenieść wszystkie parametry do tej niestandardowej podklasy. Nie jestem całkowicie pewien, czy ta logika powinna być w UIView, a nie UIVIewController, ale spróbuję. – adamsiton

4

Funkcja ta działa za to, co trzeba, ponieważ rama poglądy nie zmieniło z rotacji i nie opóźnić animację niestandardową.

-(void)willAnimateRotationToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    float width = UIInterfaceOrientationIsPortrait(toInterfaceOrientation) ? [[UIScreen mainScreen] applicationFrame].size.width : [[UIScreen mainScreen] applicationFrame].size.height; 
//do something with the width now 
//or you can get the height the same way 
} 
Powiązane problemy