iPad UISplitViewController излишне вращается при закрытии модального диалогового окна

У меня есть достаточно простое приложение с разделенным представлением, адаптированное из кода iPhone. Основная функциональность заключается в общих классах с классами, специфичными для iPhone и iPad, которые наследуют и дополняют код. Все классы, используемые в приложении для iPad, имеют следующее:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}

Контроллер основного представления состоит из UIToolbar и UITableView. Правильно реагирует на повороты на каждом этапе, такт два. Если я представлю модальный диалог из этого представления:


 navigationController = [[UINavigationController alloc] initWithRootViewController:tvc];
 navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
 [self presentModalViewController:navigationController animated:NO];

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

 [self dismissModalViewControllerAnimated:YES];

В этот момент мой основной вид поворачивается на 90 градусов. Я просмотрел настройки в файлах пера, и вроде все в порядке. Любой совет? Модальный диалог, представленный UITableView слева, не представляет этой проблемы.

Бонусный вопрос:

Я обнаружил, что в модальном диалоговом окне, представленном левым представлением, действительно есть сбой. Но только один. Если он представлен всплывающим окном в портретном режиме и устройство повернуто, вы получите довольно впечатляющий графический сбой, поскольку он навсегда исчезнет из поля зрения!


person Diziet    schedule 21.10.2010    source источник
comment
Оболочка приложения с разделенным представлением, которое я быстро создал, не отображает проблему, поэтому я сравню, сопоставлю и отправлю обратно решение, когда найду его.   -  person Diziet    schedule 22.10.2010
comment
Установка точек останова и пошаговое выполнение показывают, что shouldAutorotatetoInterfaceOrientation вызывается для каждого отображаемого представления, когда представлен контроллер модального представления. Это кажется ужасно странным, когда вид не был повернут.   -  person Diziet    schedule 25.10.2010
comment
Примечание. Поведение, упомянутое выше как «странное», кажется нормальным. Что я до сих пор считаю чертовски странным; почему эти вызовы делаются, когда устройство не вращается? Макет моего приложения таков, что главное окно дисплея состоит из xib, содержащего UIView (с UIToolbar и UITableView) и UITableViewController. Все это обычно подключается через IB. Я читал в другом месте, что наличие контроллеров представления внутри контроллеров представления - действительно глупая идея, поэтому я собираюсь объединить код в один. Это отдельная историческая причина, но по сути: простота + лень.   -  person Diziet    schedule 25.10.2010


Ответы (1)


Как отмечалось в комментарии выше, мне удалось объединить два контроллера представления в один, включив код для обработки панели инструментов + контроллер splitview в версию для iPad. Изначально существовал общий класс, унаследованный от UITableViewController, версии кода для iPad и iPhone, унаследованные от этого общего класса. Проблема заключалась в том, что на iPad я хотел панель инструментов вверху и также должен был поддерживать контроллер splitview. Это было проблематично, учитывая, что классом был UITableViewController, поэтому я создал родительский класс, содержащий панель инструментов и контроллер tableview, а также код splitview. При рефакторинге я изменил общий класс на UIViewController и внес изменения для поддержки UITableView в коде, как обычно, и это описано в нескольких книгах для разработчиков iPhone. В версии класса для iPhone я вручную создаю UITableView с необходимыми методами. В версии для iPad это файл xib. Это схематично упрощает ситуацию, поскольку теперь в главном представлении нет контроллера внутри контроллера. Это тоже решает проблему. Пользовательский интерфейс, поворачивающийся на 90 градусов после закрытия модального диалогового окна, больше не происходит.

person Diziet    schedule 27.10.2010