【发布时间】:2010-11-27 03:57:30
【问题描述】:
我需要禁用在方向改变时播放的动画。这可能吗?如果没有,是否可以加快速度?
澄清一下,我不想停止方向变化,只是动画。我想要立即改变方向。
【问题讨论】:
标签: iphone objective-c ios animation orientation
我需要禁用在方向改变时播放的动画。这可能吗?如果没有,是否可以加快速度?
澄清一下,我不想停止方向变化,只是动画。我想要立即改变方向。
【问题讨论】:
标签: iphone objective-c ios animation orientation
是的,可以禁用动画,而不会破坏所有内容。
以下代码将禁用“黑盒”旋转动画,而不会与其他动画或方向代码混淆:
- (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);
}
【讨论】:
在 iOS8 中,您可以通过在视图控制器的 viewWillTransitionToSize 实现中禁用 CALayer 动画来禁用旋转动画。
如果您想自定义过渡(请参阅 WWDC 2014 'View Controller Advancements in iOS 8'),则接受的答案中提到的反向旋转很有用,但如果您只想阻止动画,则不是。
(注意,实现 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];
}];
}
【讨论】:
根据 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)
}
【讨论】:
如果我没记错的话(这总是我必须玩一会儿才能正确的事情)willRotateToInterfaceOrientation:duration: 和 willAnimateRotationToInterfaceOrientation:duration: 都在动画块内,而 didRotateFromInterfaceOrientation: 在动画之后运行堵塞。我相信您需要在willRotate 中布置您的视图,以便它们出现在旋转后它们出现的位置如果它们没有旋转(如果有意义的话)。这样,动画会将它们从原始(正确)布局动画到与设备旋转相反的方向上的新(旋转)布局,从而创建没有动画的外观。旋转完成后,您可以在 didRotate 中布置视图,无需动画,给人一种即时旋转的印象。
一清二楚,不是吗?
【讨论】:
如果您在视图即将旋转时重新布局视图,我认为当它真正旋转时它不会有动画。
我的意思是,为每个子视图编写一个带有新坐标、框架、位置的方法,并在willRotateToInterfaceOrientation:duration: 或willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: 中调用该方法
(虽然这不是一种聪明的做事方式。我想知道,为什么你不需要动画?)
【讨论】: