iOS: анимация неправильной ориентации в rootViewController? - PullRequest
7 голосов
/ 23 марта 2012

Контекст: я пытаюсь выполнить пользовательскую анимацию от обычного UIViewController.view до UISplitViewController.view. Анимация должна отображаться слева направо.

Я установил self.window.rootViewController = viewController, где viewController является нормальным UIViewController.

После того, как пользователь проведет пальцем, вызывается следующее:

UIView *theWindow = [viewController.view superview];

[viewController.view removeFromSuperview];
[theWindow addSubview:self.splitViewController.view];


CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"];

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

1 Ответ

9 голосов
/ 02 апреля 2012

Итак, я поиграл с вашим кодом (я сделал предположение о том, как вы настроили ваш проект), и я смог получить желаемый эффект с помощью следующего кода. Я попытался установить рамки и границы слоев, видов или подслоев и т. Д., Но ничего из этого не получилось. CATransform3D, CATransform3DRotates и т. Д. Также не справились с задачей. Я также погуглил в течение целого часа. Либо ни у кого не было вашей проблемы, или никто не решил вашу проблему. В любом случае, это решение работает, и, если какой-то гуру Core Animation не сможет предложить лучшее решение, добро пожаловать в следующее:

- (void)swipeGesture:(UISwipeGestureRecognizer *)sender {

UIView *theWindow = [self.viewController.view superview];

UIInterfaceOrientation interfaceOrientation = self.viewController.interfaceOrientation;
NSString *subtypeDirection;
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
    subtypeDirection = kCATransitionFromTop;
}
else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
    subtypeDirection = kCATransitionFromBottom;
}
else {
    subtypeDirection = kCATransitionFromLeft;
}

[self.viewController.view removeFromSuperview];
[theWindow addSubview:self.splitViewController.view];

CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:subtypeDirection];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"];
}
...