【问题标题】:UIView Animation pause resume using CALayer freezes user interaction upon orientation change使用 CALayer 的 UIView 动画暂停恢复在方向更改时冻结用户交互
【发布时间】:2012-12-31 14:19:57
【问题描述】:
我正在实施以下解决方案来暂停 UIView 动画:
https://stackoverflow.com/a/3003922/1014164
暂停和恢复动画是有效的,但是:
在我暂停动画并继续旋转我的设备后,屏幕上的其他视图开始调整大小,但由于某种原因,这会冻结屏幕上的所有交互和视图 - 方向更改不再起作用,按钮无反应。
但是,如果我在动画运动时旋转设备,则一切正常。
我进行的另一项测试是取消自动调整包含动画视图的外部视图的大小,这样可以让事情正常工作。
暂停的图层和父图层的自动调整大小之间似乎存在一些冲突。我只是不知道如何绕过它。
任何帮助将不胜感激。
【问题讨论】:
标签:
uiview
uiinterfaceorientation
uiviewanimation
【解决方案1】:
正如您所发现的,视图层被暂停的事实意味着当您旋转设备时它无法动画到新的大小,这会冻结 UI。
但是,有一个更简洁的解决方案,它不会放弃 iOS 漂亮的调整大小动画或自动布局。您可以在根层下方创建一个中间层,并将所有其他层放在其下。然后你应该使用这个中间层来控制动画的速度(或暂停它们)。
由于 iOS 不会在设备旋转时调整子图层的大小,因此暂停图层并不重要。
(我意识到这个答案很晚,但它可能仍然为某人服务)。
【解决方案2】:
由于方向更改会导致正在使用其他视图上的动画,因此我必须禁用这些视图的自动调整大小遮罩,从而避免在暂停动画时发生冲突。
那些正在自动调整大小的视图在方向通知方法中手动调整大小。
【解决方案3】:
在@tarmes 的后续行动中,您还可以尝试以下方法:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
if let myView = self.view
{
let currentLayerSpeed = myView.layer.speed
coordinator.animateAlongsideTransition(
{
(context) -> Void in
// Animating alongside… nothing to animate.
if currentLayerSpeed == 0
{
myView.layer.speed = 1.0
}
})
{
// Completion
(context) -> Void in
// Rotation animation completed – resetting the layer speed
myView.layer.speed = currentLayerSpeed
}
}
}