我需要禁用方向更改时播放的动画。这可能吗?如果没有,是否可以加快速度?
只是为了澄清,我不想停止方向改变,只是动画。我希望立即改变方向。
答案 0 :(得分:48)
是的,可以禁用动画,而不会破坏一切。
以下代码将禁用“黑匣子”旋转动画,而不会弄乱其他动画或方向代码:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[UIView setAnimationsEnabled:YES];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[UIView setAnimationsEnabled:NO];
/* Your original orientation booleans*/
return TRUE;
}
将它放在你的UIViewController中,一切都很好。相同的方法可以应用于iOS中任何不需要的动画。
祝你的项目好运。
2016年,似乎shouldAutorotateToInterfaceOrientation
无法覆盖。以下似乎有效,并且不会造成其他伤害。
// these DO SEEM TO WORK, 2016
override func willRotateToInterfaceOrientation(
toInterfaceOrientation:UIInterfaceOrientation, duration:NSTimeInterval)
{
UIView.setAnimationsEnabled(false)
super.willRotateToInterfaceOrientation(toInterfaceOrientation,duration:duration)
}
override func didRotateFromInterfaceOrientation(
fromInterfaceOrientation:UIInterfaceOrientation)
{
super.didRotateFromInterfaceOrientation(fromInterfaceOrientation)
UIView.setAnimationsEnabled(true)
}
然而!! 确实这两个功能都已弃用。 viewWillTransitionToSize
现在负责“之前”和“之后”。
override func viewWillTransitionToSize(size:CGSize,
withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
{
coordinator.animateAlongsideTransition(nil, completion:
{_ in
UIView.setAnimationsEnabled(true)
})
UIView.setAnimationsEnabled(false)
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator);
}
答案 1 :(得分:12)
在iOS8中,您可以通过在视图控制器的viewWillTransitionToSize
实施中禁用CALayer动画来停用旋转动画。
如果您想要自定义过渡,则接受答案中提到的反向旋转非常有用(请参阅WWDC 2014'在iOS 8中查看控制器进度')但如果您只是想要阻止动画。
(N.B。实施viewWillTransitionToSize
将阻止调用已弃用的iOS8前轮换API。)
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[CATransaction begin];
[CATransaction setDisableActions:YES];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// You could make a call to update constraints based on the
// new orientation here.
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
[CATransaction commit];
}];
}
答案 2 :(得分:3)
基于Nils Munch的答案,这是Swift 3版本:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: nil) { (_) in
UIView.setAnimationsEnabled(true)
}
UIView.setAnimationsEnabled(false)
super.viewWillTransition(to: size, with: coordinator)
}
答案 3 :(得分:2)
如果我没记错的话(这总是我必须花一点时间才能做到正确)willRotateToInterfaceOrientation:duration:
和willAnimateRotationToInterfaceOrientation:duration:
都在动画块中,而{{1在动画块之后运行。我相信您需要在didRotateFromInterfaceOrientation:
中显示您的观点,以便它们出现在旋转旋转后的位置(如果有意义的话)。通过这种方式,动画可以将它们从原始(正确)布局设置为与设备旋转相反方向的新(旋转)布局,从而创建无动画的外观。旋转完成后,您可以在willRotate
中布置无动画的视图,给人的印象是它们会立即旋转。
清除泥土,没有?
答案 4 :(得分:0)
如果在视图即将旋转时重新布局视图,我认为当它真正旋转时,它将没有动画。
我的意思是,用每个子视图的新坐标,框架,位置编写一个方法,并在willRotateToInterfaceOrientation:duration:
或willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
中调用该方法
(虽然这不是一种聪明的做事方式。我想,你为什么不需要动画?)