2015-02-11 4 views
11

У нас есть MainViewController с tableView, и он представляет новый modalViewController.iOS8 - предотвращает поворот при представлении viewController

MainViewController ограничен только портретом, и modalViewController может вращаться.

Проблема заключается в iOS8, что когда modalViewController вращается, метод обратного вызова вращения в iOS8 в MainViewcontroller называется - - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

Таким образом, UITableView становится его данные перезагружается, что поведение мы не» я хочу.

Можем ли мы предотвратить эту функцию iOS 8, а не поворачивать презентационный UIViewController?

+0

Является ли обратный вызов вообще на iOS7? Потому что согласно [документации] (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIContentContainer_Ref/index.html#//apple_ref/occ/intfm/UIContentContainer/viewWillTransitionToSize:withTransitionCoordinator:) это было введено на iOS8 – Leonardo

+0

@ Leonardo в iOS7 все в порядке, это действительно особенность iOS8, что я не хочу ... – oren

+0

переопределить его и заставить его ничего не делать – Leonardo

ответ

11

Итак, после долгих дней поиска и расследования я, наконец, придумал возможное решение.

Прежде всего, я могу использовать контроллер навигации и нажимать viewController вместо его представления, но он прерывает мой код, и это не так.

Вторая вещь, которую я могу сделать, - это не устанавливать ограничения. Я все еще могу использовать автозапуск, но если я не задаю ограничений и не устанавливаю ограничения по умолчанию, таблицаView не будет перезагружена. конечно, это тоже не очень умная вещь, потому что у меня много элементов в моем viewController.

Наконец-то я понял, что могу показать этот «модальный» viewController в другом UIWindow. Я создаю UIWindow и устанавливаю modalViewController как свой rootViewController.

я ставлю некоторый пример проект в мерзавце: https://github.com/OrenRosen/ModalInWindow

Надеется, что это будет полезно.

+0

Отлично !!!это именно то, что я искал –

+0

Это то, что я пытался и искал долго. Большое вам спасибо @oren –

+0

@oren У меня есть эта проблема и на iOS 9. Обходным решением является проверка представленногоViewController – onmyway133

0

Я сделал что-то similar с навигационным контроллером, который не вращается, если верхний толкаемый контроллер вращается.

В вашем случае проверьте, представит ли главный контроллер другой контроллер. Если это не так, просто отклоните вращение, иначе верните все возвращаемые контроллером данные для метода вращения.

Что касается вашего стола, он не должен получать перезаряжен из-за поворота.

+0

Мне нужно представить modult viewController, а не push viewController, я уже знаю, что при нажатии viewController он не поворачивается, пожалуйста, прочитайте комментарии и другие ответы, прежде чем отправлять вопрос. И когда вы представляете модально в iOS8, когда представленный viewController вращается, весь экран вращается, и это влияет и на presentingViewController. Спасибо в любом случае – oren

+0

Я прочитал вопрос и знаю, что вы хотите представить, а не толчок. Я просто привел пример с толкающими контроллерами, которые могли бы работать и с представленными контроллерами. – Rivera

+0

Спасибо, я ценю это. Но я попробовал все возможные решения и не работал для меня. Это похоже на то, что отображающий viewController не вращается, но он делает, его размер вида действительно меняется. Во всяком случае, я разрешил это с дополнительным UIWindow. тем временем он работает как прелесть, но я все еще жду неожиданного поведения ... :) – oren

0

В iOS 8 вид, который вращается при изменении ориентации устройства, представляет собой первое представление, добавленное к UIWindow. Итак, если вы сохраните ссылку на него в своем presentedController, вы можете перезаписать значения и supportedInterfaceOrientations.