动画 UIView 时的奇怪效果

Posted

技术标签:

【中文标题】动画 UIView 时的奇怪效果【英文标题】:Curious effect when animating UIViews 【发布时间】:2017-02-09 15:38:57 【问题描述】:

我正在让方块出现在屏幕顶部,一直运行直到它们到达底部然后消失。这是在 ViewController 的视图中添加一个新的 UIView 完成的,然后在动画完成后,将其从子视图数组中删除。为了给这一切增添一些美感,我在创建时使用 CGAffineTransform 应用随机旋转。

这里奇怪的是,当它们移动时,它们会随机缩放!我知道这一定和旋转有关,因为如果我不应用它,所有的方块都会完美移动而不会缩放,但是当我应用它时,它就会发生,所以......

我希望有人可以测试它并告诉我发生了什么...为什么正方形会缩放???

这是代码:

import UIKit

class ViewController: UIViewController 

    var timer: Timer!

    override func viewDidLoad() 
        timer = Timer.scheduledTimer(
            timeInterval: 1,
            target: self,
            selector: #selector(createView),
            userInfo: nil,
            repeats: true
        )
    

    @objc private func createView () 
        let v = UIView(frame: CGRect(
            x: self.view.bounds.width / 2 - 50,
            y: -100,
            width: 100,
            height: 100
        ))
        v.backgroundColor = UIColor.red
        v.transform = CGAffineTransform(
            rotationAngle: CGFloat(Double(arc4random_uniform(360)) * M_PI / 180)
        )
        self.view.addSubview(v)

        UIView.animate(withDuration: 5, delay: 0, options: [.curveLinear], animations: 
            v.frame.origin.y = self.view.bounds.height
        , completion: 
            _ in
            v.removeFromSuperview()
        )

        print(self.view.subviews.count)
    


【问题讨论】:

【参考方案1】:

动画俱乐部的第一条规则是当你改变它的变换时不要操纵视图的框架。

如果视图的变换不是恒等变换,则框架是未定义的,尝试更改框架将导致未定义的行为。听起来您正在经历一些未定义的行为。

您应该重构代码以操作视图的中心属性而不是框架,或者使用变换应用偏移量,但这很棘手,因为旋转会改变偏移量的参考框架。

我建议调整视图的 center 属性。

【讨论】:

不用担心。任何时候当您查看视图的框架时得到奇怪的结果,或者更改框架会导致奇怪的结果,请检查非恒等变换。我以前忘记了这条规则,浪费时间挠头,试图找出问题所在。

以上是关于动画 UIView 时的奇怪效果的主要内容,如果未能解决你的问题,请参考以下文章

UIView动画效果

IOS开发-UIView之动画效果的实现方法(合集)

动画特效三:搜索动画

在视图大小更改时更改 UIView 阴影大小会产生奇怪的效果

动画效果

将 UILabel 添加到 UIView 时,它的动画效果不正确