2015-02-11 17 views
11

Mamy MainViewController z tableView, i prezentuje nowy modalViewController.iOS8 - zapobiec rotacji podczas prezentacji viewController

Sterownik MainViewCransfer jest ograniczony tylko do portretu, a moduł modalViewController może się obracać.

Problem jest w systemów iOS 8, że gdy modalViewController obraca, metoda zwrotna obrotu w systemów iOS 8 w MainViewcontroller nazywa - - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

Zatem UITableView jest uzyskiwanie jej dane przeładowane, co jest zachowanie możemy don” t chcę.

Czy możemy zapobiec tej funkcji systemu iOS 8, a nie obracać prezentacji UIViewController?

+0

Czy wywołanie zwrotne jest w ogóle wywoływane na iOS7? Ponieważ zgodnie z [dokumentacją] (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIContentContainer_Ref/index.html#//apple_ref/occ/intfm/UIContentContainer/viewWillTransitionToSize:withTransitionCoordinator:) został wprowadzony na iOS8 – Leonardo

+0

@ Leonardo w iOS7 wszystko jest w porządku, to jest rzeczywiście funkcja iOS8, której nie chcę ... – oren

+0

nadpisuję ją i sprawię, że nic się nie stanie – Leonardo

Odpowiedz

11

Więc po długich dniach poszukiwań i badań, w końcu wymyśliłem możliwe rozwiązanie.

Przede wszystkim mogę użyć kontrolera nawigacyjnego i popchnąć viewController zamiast go prezentować, ale łamie mój kod i po prostu nie jest tak prawdziwy.

Drugą rzeczą, którą mogę zrobić, to nie ustawiać wiązań. Nadal mogę korzystać z autolayout, ale jeśli nie ustawię ograniczeń i ustawię domyślne ograniczenia, tabela tableView nie zostanie ponownie załadowana. Oczywiście nie jest to zbyt inteligentne, ponieważ mam wiele elementów w moim viewController.

W końcu, zorientowałem się, że mogę pokazać ten "modalny" viewController w innym UIWindow. Tworzę UIWindow i ustawia modalViewController jako jego rootViewController.

kładę jakiś przykładowy projekt w git: https://github.com/OrenRosen/ModalInWindow

nadzieję, że będzie pomocny.

+0

Perfect !!!właśnie to szukałem. –

+0

To właśnie próbowałem i szukałem od dłuższego czasu. Dziękuję bardzo @oren –

+0

@oren Mam ten problem również na iOS 9. Obejście problemu polega na sprawdzeniu prezentowanego kontrolera ViewController – onmyway133

0

Zrobiłem coś similar za pomocą kontrolera nawigacyjnego, który nie obróciłby się, chyba że górny kontroler pchnął.

W twoim przypadku sprawdź, czy główny kontroler wyświetla inny kontroler. Jeśli nie, to po prostu odrzuć rotację, w przeciwnym razie zwróć wszystko, co przedstawiony kontroler zwróci dla metody rotacji.

Jeśli chodzi o widok tabeli, nie powinien on zostać ponownie załadowany z powodu rotacji.

+0

Muszę przedstawić modalnie viewController, a nie push viewController, już wiem, że po naciśnięciu viewController nie jest on obracany, proszę przeczytaj komentarze i inne odpowiedzi zanim opublikujesz pytanie. A gdy prezentuje się modalnie w iOS8, kiedy przedstawiony obiekt ViewController obraca się, cały ekran obraca się i ma wpływ również na presentViewController. Mimo to dziękuję – oren

+0

Przeczytałem to pytanie i wiem, że chcesz przedstawić, a nie naciskać. Podałem wam przykład z pchającymi kontrolerami, którzy mogliby również pracować z przedstawionymi kontrolerami. – Rivera

+0

Dzięki, doceniam to. Ale wypróbowałem wszystkie możliwe rozwiązania i nie zadziałało dla mnie. Wygląda na to, że widok viewController nie obraca się, ale tak jest, zmienia się rozmiar jego widoku. W każdym razie rozwiązałem to z dodatkowym UIWindow. tymczasem działa jak urok, ale wciąż czeka na nieoczekiwane zachowanie ... :) – oren

0

W systemie iOS 8 widok obraca się po zmianie orientacji urządzenia jest pierwszym widokiem dodanym do UIWindow. Jeśli więc zapiszesz odniesienie do niego w swoim numerze presentedController, możesz zastąpić wartości shouldAutorotate i supportedInterfaceOrientations.

Powiązane problemy