Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设置UIView动画时的奇怪效果_Ios_Swift_Animation_Uiview_Cgaffinetransform - Fatal编程技术网

Ios 设置UIView动画时的奇怪效果

Ios 设置UIView动画时的奇怪效果,ios,swift,animation,uiview,cgaffinetransform,Ios,Swift,Animation,Uiview,Cgaffinetransform,我让方块出现在屏幕的顶部,一直跑到底部然后消失。将新UIView添加到ViewController的视图中,然后在动画完成后,将其从子视图阵列中删除。为了给这一切增添几分美丽,我在它们创建时使用CGAffineTransform应用了一个随机旋转 奇怪的是,当它们移动时,它们被随机缩放!我知道这一定与旋转有关,因为如果我不应用它,所有的方块都会完美地移动而不缩放,但当我应用它时,它会发生,所以 我希望有人能测试一下,告诉我发生了什么。。。为什么正方形在缩放 代码如下: import UIKit

我让方块出现在屏幕的顶部,一直跑到底部然后消失。将新UIView添加到ViewController的视图中,然后在动画完成后,将其从子视图阵列中删除。为了给这一切增添几分美丽,我在它们创建时使用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)
    }

}

动画俱乐部的第一条规则是,在更改视图的变换时,不要操纵视图的帧

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

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


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

不用担心。当查看视图的帧时,如果出现奇怪的结果,或者更改帧会导致奇怪的结果,请检查是否存在非标识变换。我以前忘记了这条规则,浪费时间搔搔头,试图找出问题所在。