动画UIViews时的好奇效果

时间:2017-02-09 15:38:57

标签: ios swift animation uiview cgaffinetransform

我正在制作正方形出现在屏幕顶部,直到它们到达底部然后消失。这样做就是在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 个答案:

答案 0 :(得分:3)

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

如果视图的变换不是标识变换,则帧未定义,并且尝试更改帧将导致未定义的行为。听起来你正在经历一些未定义的行为。

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

我建议调整视图的中心属性。