willRotateToInterfaceOrientation не вызывается на iOS8
Я использую библиотеку VFR PDF viewer в своем приложении, где я представляю ее следующим образом:
ReaderDocument *document = [ReaderDocument withDocumentFilePath:pdfFile password:nil];
ReaderViewController *vc = [[ReaderViewController alloc] initWithReaderDocument:document];
[self.navigationController pushViewController:vc animated:YES];
Если я запускаю на iOS7, все работает нормально.
Если я запускаю свое приложение на iOS8, метод willRotateToInterfaceOrientation в ReaderViewController никогда не вызывается, поэтому, когда устройство поворачивается, документ не корректно переформатируется.
Однако, если я запускаю демонстрационное приложение, которое поставляется с библиотекой на iOS8, willRotateToInterfaceOrientation в ReaderViewController действительно вызывается, что приводит меня к мысли, что библиотека в порядке, и я делаю что-то не так (или пренебрегаю чем-то) приложение.
Я довольно озадачен таким поведением. Почему в моем приложении на iOS8 не будет вызываться RotateToInterfaceOrientation, а в других вариантах это происходит? Как я могу попытаться отследить это?
2 ответа
Мне наконец удалось решить мою проблему; Вот в чем проблема, если у кого-то есть такая же проблема.
мой ReaderViewController
был представлен из класса, который реализовал viewWillTransitionToSize:withTransitionCoordinator:
поэтому устаревшие методы на дочерних контроллерах представления не вызывались.
Кроме того, в этой реализации это не вызывало
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]
и так viewWillTransitionToSize:withTransitionCoordinator:
Метод всех дочерних контроллеров представления также не вызывался.
Исправление состояло в том, чтобы добавить вызов
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]
в родительские ВК viewWillTransitionToSize:withTransitionCoordinator:
метод, подкласс ReaderViewController
затем добавьте viewWillTransitionToSize:withTransitionCoordinator:
в мой подкласс для вызова соответствующих методов в ReaderViewController
,
Просто потому что willRotateToInterfaceOrientation
больше не называется в iOS8, это устарело.
Если новые методы ротации не реализованы, и проект компилируется с помощью iOS 8 SDK, контроллеры представления - не будут получать вызовы - устаревшие методы ротации.
Подобный вопрос к вам может быть найден здесь
Цитирование @mluisbrown:
Методы ротации устарели в iOS 8 SDK. Это никак не повлияет на приложения, созданные с помощью iOS 7 SDK, даже на iOS 8 и, возможно, в нескольких будущих версиях iOS.
Я немного боролся с какой-то проблемой, похожей на вашу. Я пытался следовать рекомендации Apple, чтобы использовать viewWillTransitionToSize
, что в моем случае не решило мою проблему, потому что это срабатывает только при изменении с обычного на компактное, например, не на вращение.
viewWillTransitionToSize: withTransitionCoordinator: сделать корректировки на основе интерфейса.
Что подробно описано в документации Apple
Кроме того, видео WWDC 2014 объясняет это, но я не могу вспомнить, какое это было видео. Возможно тот на What's new in Cocoa touch
или тот, на View Controller Advancements in iOS 8
,
РЕДАКТИРОВАТЬ
Обратите внимание, что в моем случае viewWillTransitionToSize
Как объяснено, не был вызван, потому что я не переходил с обычного на компактный, поэтому не было никакого перехода размера, строго говоря для Apple.
Единственное решение, которое я нашел, было обработать это вручную в viewDidLayoutSubviews
соответствующего контроллера представления.
В моем случае я хотел отслеживать верхнюю ячейку, отображаемую в табличном представлении с помощью autolayout. Поскольку система не отслеживала это автоматически, мне пришлось проверить это вручную и вручную прокрутить до нужной ячейки при вращении. Вот почему я так и сделал. Это довольно "тяжело", но работает в моем случае.
Мне также было бы интересно, если у кого-нибудь есть более простое решение.