如何使 UIView 动画重新执行,而不是 .repeat in IOS (Swift)
How to make UIView animation re-execute, not .repeat in IOS (Swift)
我想扩展 UIView 以包含一个动画,该动画可以无限期地进行视图抖动(连续但随机旋转和平移距离)。
我尝试将以下扩展添加到 UIView:
func tremble() {
UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: {
var randomFromZeroToOne = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
let randomBool:Bool = arc4random_uniform(2) == 0
if randomBool { randomFromZeroToOne = -randomFromZeroToOne }
let degrees = randomFromZeroToOne / 5
self.transform = CGAffineTransform(translationX: randomFromZeroToOne, y: randomFromZeroToOne)
self.transform = CGAffineTransform.init(rotationAngle: degrees)
}, completion: nil)
}
但我现在看到 .repeat 选项只是重复完全相同的动画(使用所有最初定义的 "random" 变量,它不会重新执行动画(使用每个变量创建新的随机变量执行)。
我怎样才能让它做我想做的事?我尝试了其他选项,例如 .beginFromCurrentState、.overrideInheritedOptions...
你可以试试这个
func tremble() {
var randomFromZeroToOne = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
let randomBool:Bool = arc4random_uniform(2) == 0
if randomBool { randomFromZeroToOne = -randomFromZeroToOne }
let degrees = randomFromZeroToOne / 5
UIView.animate(withDuration: 0.5, delay: 0, options: [ .allowUserInteraction], animations: {
self.transform = CGAffineTransform(translationX: randomFromZeroToOne, y: randomFromZeroToOne)
self.transform = CGAffineTransform.init(rotationAngle: degrees)
}, completion: {
self.tremble()
})
}
我想扩展 UIView 以包含一个动画,该动画可以无限期地进行视图抖动(连续但随机旋转和平移距离)。
我尝试将以下扩展添加到 UIView:
func tremble() {
UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: {
var randomFromZeroToOne = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
let randomBool:Bool = arc4random_uniform(2) == 0
if randomBool { randomFromZeroToOne = -randomFromZeroToOne }
let degrees = randomFromZeroToOne / 5
self.transform = CGAffineTransform(translationX: randomFromZeroToOne, y: randomFromZeroToOne)
self.transform = CGAffineTransform.init(rotationAngle: degrees)
}, completion: nil)
}
但我现在看到 .repeat 选项只是重复完全相同的动画(使用所有最初定义的 "random" 变量,它不会重新执行动画(使用每个变量创建新的随机变量执行)。
我怎样才能让它做我想做的事?我尝试了其他选项,例如 .beginFromCurrentState、.overrideInheritedOptions...
你可以试试这个
func tremble() {
var randomFromZeroToOne = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
let randomBool:Bool = arc4random_uniform(2) == 0
if randomBool { randomFromZeroToOne = -randomFromZeroToOne }
let degrees = randomFromZeroToOne / 5
UIView.animate(withDuration: 0.5, delay: 0, options: [ .allowUserInteraction], animations: {
self.transform = CGAffineTransform(translationX: randomFromZeroToOne, y: randomFromZeroToOne)
self.transform = CGAffineTransform.init(rotationAngle: degrees)
}, completion: {
self.tremble()
})
}