2014-11-10 21 views
9

Używam VFR PDF viewer library w moim app, gdzie mogę zaprezentować go w ten sposób:nie willRotateToInterfaceOrientation wezwał systemów iOS 8

ReaderDocument *document = [ReaderDocument withDocumentFilePath:pdfFile password:nil]; 
ReaderViewController *vc = [[ReaderViewController alloc] initWithReaderDocument:document]; 
[self.navigationController pushViewController:vc animated:YES]; 

Jeśli biegnę na iOS7, wszystko działa bez zarzutu.

Jeśli uruchomię swoją aplikację na iOS8, metoda willRotateToInterfaceOrientation w ReadViewController nigdy nie zostanie wywołana, więc po obróceniu urządzenia dokument nie zostanie poprawnie sformatowany.

Jednakże, jeśli uruchomię aplikację demo, która jest dostarczana z biblioteką w systemie iOS 8, wywoływana jest funkcja willRotateToInterfaceOrientation w ReadViewController, co prowadzi mnie do przekonania, że ​​biblioteka jest w porządku, i robię coś nie tak (lub zaniedbanie coś) w mojej aplikacji.

Jestem raczej zdziwiony tym zachowaniem. Dlaczego usługa RotateToInterfaceOrientation nie zostanie wywołana w mojej aplikacji na iOS8, ale działa w innych wersjach? Jak mogę spróbować to wyśledzić?

Odpowiedz

12

W końcu udało mi się rozwiązać mój problem; Oto, o co chodziło, gdyby ktoś miał ten sam problem.

Mój obiekt ReaderViewController był prezentowany z klasy, która zaimplementowała viewWillTransitionToSize:withTransitionCoordinator:, dlatego nieużywane były nieaktualne metody na kontrolerach podrzędnych.

Również w tej realizacji nie dzwoni

[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator] 

a więc metoda wszystkich kontrolerów widoku dziecko viewWillTransitionToSize:withTransitionCoordinator: nie nazwano jest albo.

Rozwiązaniem było dodanie połączenia do

[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator] 

do viewWillTransitionToSize:withTransitionCoordinator: metoda dominującej VC, podklasy ReaderViewController, a następnie dodać viewWillTransitionToSize:withTransitionCoordinator: do mojego podklasy wywołać odpowiednie metody w ReaderViewController.

+0

Gdy zdołasz rozwiązać swój problem, możesz zatwierdzić własną odpowiedź jako zaakceptowaną odpowiedź, aby inni wiedzieli, że jest ona rozwiązana. – HpTerm

3

Po prostu dlatego, że willRotateToInterfaceOrientation nie jest już wywoływane w iOS8, jest przestarzałe.

Jeśli nowe metody rotacji nie są realizowane, a projekt jest skompilowany z iOS 8 SDK, kontrolery widoku nie -will otrzymać calls- do przestarzałych metod rotacji.

Podobny pytanie twoich można znaleźć here

cytowanie @mluisbrown:

Metody obrotu są przestarzałe w iOS 8 SDK. W przypadku aplikacji utworzonych z iOS 7 SDK będzie to miało zupełnie zerowy wpływ, nawet w systemie iOS 8 i prawdopodobnie w kilku przyszłych wersjach systemu iOS.

Zmagałem się trochę z jakimś podobnym problemem do Ciebie. Próbowałem postępować zgodnie z zaleceniami firmy Apple, aby użyć viewWillTransitionToSize, co w moim przypadku nie rozwiązało mojego problemu, ponieważ jest on wyzwalany tylko w przypadku zmian z wersji regularnej na kompaktową, na przykład bez obracania.

viewWillTransitionToSize: withTransitionCoordinator: do wprowadzenia korekt opartych na interfejsie .

Który jest szczegółowo w apple documentation

Również wideo WWDC 2014 wyjaśnia to, ale nie mogę sobie przypomnieć, który to był film. Być może ten na What's new in Cocoa touch lub na View Controller Advancements in iOS 8.

EDIT

Należy zauważyć, że w moim przypadku viewWillTransitionToSize, jak wyjaśniono, nie był nazywany bo nie zmienia się od regularnego kompaktowanie więc nie było przejście rozmiar, ściśle mówiąc dla Apple.

Jedynym rozwiązaniem, które fount miałem obsługiwać to ręcznie w viewDidLayoutSubviews odpowiedniego kontrolera widoku.

W moim przypadku chciałem śledzić najwyższą komórkę wyświetlaną w widoku tabeli z autolayout. Ponieważ nie był śledzony automatycznie przez system, musiałem to sprawdzić ręcznie i przewinąć ręcznie do odpowiedniej komórki przy rotacji. Właśnie dlatego zrobiłem to w ten sposób. Jest dość "ciężki", ale działa w moim przypadku.

Byłbym także zainteresowany, gdyby ktoś miał łatwiejsze rozwiązanie.

+0

Dodałem metodę viewWillTransitionToSize: withTransitionCoordinator: do klasy ReaderViewController, która nie jest również wywoływana podczas obracania urządzenia. Czy muszę dodać cokolwiek oprócz dodania tej metody? –

+0

Rotacja nie jest dokładnie przejściem wielkości. Apple zakłada, że ​​jest to jeden z nich, w przypadku przejścia z formatu kompaktowego do standardowego w układzie poziomym lub pionowym. W moim przypadku, aby wykryć rotację musiałem obsługiwać zachowanie ręcznie w viewDidAppear określonego kontrolera. Niestety nie znalazłem innego łatwego do zrobienia. – HpTerm

+1

Teraz jestem jeszcze bardziej zdezorientowany! viewDidAppear jest wywoływany tylko wtedy, gdy pojawia się widok, a nie kiedy urządzenie jest obracane, więc nie rozumiem, jak sobie z nim radzisz. –

Powiązane problemy