在我的情节提要中,我有一个按钮想要无限次闪烁,直到程序被杀死。这是到目前为止我所做的,此代码使该按钮仅动画一次。
@IBOutlet weak var blinker: UIButton!
func Blink(){
blinker.alpha = 0.0
UIButton.animateWithDuration(1, animations: {
self.blinker.alpha = 1.0
}, completion: {
(value: Bool) in
println(">>> Animation done.")
})
}
任何帮助将不胜感激。...
如果您不打算使用CABasicAnimation
或CAAnimation
的其他变体,最好的方法是递归执行。例如:
func Blink(){
blinker.alpha = 0.0
UIButton.animateWithDuration(1, animations: {
self.blinker.alpha = 1.0
}, completion: {
(value: Bool) in
println(">>> Animation done.")
Blink()
})
}
这样,动画制作完成后,您会一次又一次地调用它...
请参阅Glenn's answer以获取正确的处理方法。此解决方案可能会导致堆栈溢出问题。
尽管以上答案可以,但是您可以使用.autoreverse | .repeat选项。那将是一种更干净的方法。
确保您的按钮与ViewController的插座相连。
将此添加到Viewcontroller的ViewDidLoad中:
timer = NSTimer(timeInterval: 1.0, target: self, selector: "blink", userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
然后执行功能
func blink () {
if blinkStatus == false {
blinkingButton.tintColor = UIColor.lightGrayColor()
blinkStatus = true
} else {
blinkingButton.tintColor = UIColor.blackColor()
blinkStatus = false
}
}
这应该可以解决问题。我尝试了一下,它奏效了。它基于:https://www.weheartswift.com/nstimer-in-swift/
有点儿含糊,基于我承认的Glenn's答案,但这是在iOS 13上测试的另一个答案,迅速5。
var blinkStatus:Bool?
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
if self.blinkStatus != nil {
self.button.alpha = self.blinkStatus! ? 1:0
self.blinkStatus = !self.blinkStatus!
} else {
self.button.alpha = 1
timer.invalidate()
}
设置blinkStatus = false使其开始闪烁,而blinkStatus = nil使其停止。显然,按钮必须是您要闪烁的UIButton距离。