UIView在设备旋转后停止动画

3
我有一些视图和图片视图。
_contentView = [[UIView alloc] initWithFrame:self.bounds];
_contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
....

UIImageView *imageView = [[UIImageView alloc] initWithImage:someImage];
[_contentView addSubview:imageView];

这个imageView运行一些动画。

[UIView animateWithDuration:1.6f delay:0.0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations:^{
    imageView.center = somePoint;
} completion:^(BOOL finished) {

}];

问题在于旋转动画停止了。如果我将_contentView的自动调整大小掩码更改为灵活的边界,则可以继续进行旋转动画。但我需要它具有灵活的大小。 有人能解释一下为什么旋转后动画会停止吗?
3个回答

2

2019的技巧...

两个秘诀:

1. 在重新开始动画之前,必须重置值

实际上我不知道为什么 - 这完全是神秘的 - 但这是事实。

2. 必须在协调器完成后重新启动它。

在 willTransition 的主体等任何其他地方都不行。

所以……

你有一个正在动画的约束条件...

@IBOutlet var slider: NSLayoutConstraint!

"最初的回答":假设初始值为“55”,您可以通过不断地动画滚动来实现循环滚动,例如:
func slide() {
    let w = sliderView.frame.width

    ////////// SECRET TIP ------->
    slider.constant = 55
    ////////// <--------SECRET TIP

    view.layoutIfNeeded()
    UIView.animate(withDuration: 10, delay: 0,
      options: [.repeat, .curveLinear, .beginFromCurrentState],
      animations:{ [weak self] in
        self?.slider.constant = w
        self?.view.layoutIfNeeded()
    })
}

删除“秘密提示”行,否则它将无法正常工作 - 试一下吧! 当屏幕出现时,您就可以开始了...
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    slide()
}

当屏幕旋转时,您可以继续动画:

当屏幕旋转时,您可以继续动画:

override func willTransition(to newCollection: UITraitCollection,
  with coordinator: UIViewControllerTransitionCoordinator) {
    super.willTransition(to: newCollection, with: coordinator)
    coordinator.animate(alongsideTransition: { _ in
    },completion: { [weak self] _ in
        self?.slide()
    })
}

"最初的回答"
(请注意,实际上您并不需要取消、暂停或以其他方式操作动画:iOS将通过以上方式平稳处理。)
就是这样!

0

我有同样的问题,也许你使用了这个无效的函数?只需设置[UIView setAnimationsEnabled:YES]即可重新激活动画。希望这个解决方案能对你有所帮助。

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [UIView setAnimationsEnabled:NO];
}

-1

在动画播放期间禁用设备旋转,并在动画结束后,如果设备在动画期间被旋转,则旋转屏幕。这应该解决问题。


我尝试在正常设备旋转的情况下找到解决方案或解释。 - B.S.
尝试在设备旋转时暂停并在旋转完成后恢复它。 - moray95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接