Вопрос о ротации, когда задействованы несколько видов
Я относительный новичок в какао и программировании для iPad.
Я построил приложение с контроллером разделенного представления. В подробном представлении находится панель инструментов с кнопкой на ней. Когда кнопка нажата, контроллер разделенного представления удаляется из суперпредставления, и на его место ставится другой вид. Кнопка на панели инструментов в этом новом представлении удаляет представление и возвращает разделенное представление назад. Прекрасно работает... за исключением случаев, когда Ipad поворачивается, когда виден второй вид. Когда пользователь возвращается в разделенное представление, оно отображается так, как оно было до поворота.
Разделенное представление и все вложенные представления устанавливаются в autoresize=yes и возвращают yes, когда получают сообщение autorotatetointerfaceorientation.
Я предполагаю, что мне нужно указать разделенному представлению и его вложенным представлениям изменение размера, когда я добавлю его в качестве подпредставления в окно.
Спасибо Крис
2 ответа
Пожалуйста, смотрите мой вопрос по этому вопросу здесь:
Лучший способ переключаться между UISplitViewController и другими контроллерами представления?
Если вы используете UISplitViewController в соответствии с намерениями Apple, он весьма ограничен.
Я закончил тем, что использовал стратегию в точности, как вы упомянули - т.е. удалите представление UISplitViewController из UIWindow и замените его другим, а затем переключитесь обратно. Я обнаружил, что изменение ориентации БЫЛО обработано, даже если я повернулся во время представления вида B (B - вид без разделения), а затем переключился обратно на A (вид разделения). Однако, чтобы заставить его работать, мне пришлось немного поиграться с размером фрейма в uisplitview. Буду обновлять с более подробной информацией позже, когда я его найду.
Также есть возможность написать свой собственный контроллер разделенного представления или использовать переопределение другого, например, такого:
http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad
ОБНОВИТЬ
Тревожность, которую я сделал с размером кадра UISplitView, можно увидеть в следующем методе в моем AppDelegate. Эти методы предназначены для представления контроллера разделенного представления путем замены другого контроллера представления верхнего уровня в UIWindow:
- (void)removeAllWindowSubviews {
for (UIView *childView in window.subviews) {
[childView removeFromSuperview];
}
}
- (void)presentSplitView:(UISplitViewController *)vc {
[self removeAllWindowSubviews];
UIView *viewForSplitVC = vc.view;
// fix for deficiency in adding a split view controller's view in landscape mode
// and it still having a frame for portrait mode.
// 2010-10-15 added -20.0f to fix problem with toolbar in LHS VC being 20 pix too low.
viewForSplitVC.frame = CGRectMake(viewForSplitVC.frame.origin.x, viewForSplitVC.frame.origin.y,
navigationController.view.bounds.size.width, navigationController.view.bounds.size.height - 20.0f);
[window addSubview:viewForSplitVC];
}
// for removing the split view and restoring the other main VC
- (void)restoreMenu {
if (isIPad()) {
[self removeAllWindowSubviews];
[window addSubview:navigationController.view];
}
}
Как я уже сказал, это взлом, но исправление фрейма дало мне возможность представить разделенный VC без порочного фрейма. И, как я уже отмечал ранее, занимаясь этим, мы выходим за пределы того, что Apple хочет, чтобы мы делали, отсюда и хакерство.
Хорошо, у меня есть идея, что может сработать: не удаляйте представление UISplitViewController из иерархии представлений. Вместо этого, либо установите вид сверху, установите alpha
свойство его зрения на 0 или установить hidden
Свойство его зрения на ДА.