Вопрос о ротации, когда задействованы несколько видов

Я относительный новичок в какао и программировании для 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 Свойство его зрения на ДА.

Другие вопросы по тегам