动画 UIViews 时的奇怪效果
Curious effect when animating UIViews
我正在让方块出现在屏幕顶部,运行直到它们到达底部然后消失。这是通过向 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)
}
}
动画俱乐部的第一条规则是在更改视图的变换后不要操纵视图的框架。
如果视图的变换不是恒等变换,则框架未定义,尝试更改框架将导致未定义的行为。听起来您遇到了一些未定义的行为。
您应该重构您的代码以操纵视图的中心 属性 而不是框架,或者使用变换应用您的偏移,但这很棘手,因为旋转会改变偏移的参考框架。
我建议调整视图的中心 属性。
我正在让方块出现在屏幕顶部,运行直到它们到达底部然后消失。这是通过向 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)
}
}
动画俱乐部的第一条规则是在更改视图的变换后不要操纵视图的框架。
如果视图的变换不是恒等变换,则框架未定义,尝试更改框架将导致未定义的行为。听起来您遇到了一些未定义的行为。
您应该重构您的代码以操纵视图的中心 属性 而不是框架,或者使用变换应用您的偏移,但这很棘手,因为旋转会改变偏移的参考框架。
我建议调整视图的中心 属性。