Итак, без лишних слов, вот рабочий код:

использовать UISplitViewController, я заменяю мой корневой оконный контроллер при переходе от одного контроллера представления к другому.

Чтобы получить при этом хороший переход, я использую эффект масштабирования, подобный этому:

MyOtherViewController *controller = [[MyOtherViewController alloc] initWithNibName:@"MyOtherView" bundle:nil];
UIWindow *window = ((MyAppDelegate *)[[UIApplication sharedApplication] delegate]).window;

controller.view.frame = [window frame];
controller.view.transform = CGAffineTransformMakeScale(0.01,0.01);
controller.view.alpha = 0;

[window addSubview:controller.view];

[UIView animateWithDuration:0.2 animations:^{
    controller.view.transform = CGAffineTransformMakeScale(1,1);
    controller.view.alpha = 1.0;
} completion:^(BOOL finished) {
    if (finished) { 
        [self.view removeFromSuperview];
         window.rootViewController = controller;
    }
}];

и это работает довольно хорошо, за исключением того, что во время анимации новый вид всегда ориентируется как в портретном режиме, независимо от текущей ориентации устройства. Когда анимация закончена, вид ориентируется правильно.

Чего мне не хватает?

Вещи, которые я пробовал:

положить мой новый вид контроллера в качестве единственного подпредставления UIWindowсделать мой новый контроллер корневым контроллером до начала анимации

Любопытно, что, если я делаю recursiveDescription для окна в начале моего метода, оконная рама определяется как имеющая размер 768x1024 (т. Е. Портретная), и представление внутри нее 748x1024, но с преобразованием [0, -1, 1, 0, 0, 0] (это означает вращение или что? Разве это не должно быть преобразование идентичности?)

Ответы на вопрос(2)

Ваш ответ на вопрос