1

在我的故事板中,我有一个按钮,我想让它无限闪烁直到程序被杀死。这是我到目前为止所做的,这段代码使按钮只动画一次。

@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.")
        })

    }

任何帮助,将不胜感激....

4

6 回答 6

4

如果您不打算使用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()
        })

    }

这样,当动画完成时,您会一次又一次地调用它...

更新

请参阅格伦的回答以了解正确的处理方法。此解决方案可能会导致堆栈溢出问题。

于 2015-09-23T07:09:24.110 回答
3

确保你有一个按钮连接到你的 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/

于 2015-09-23T10:05:27.180 回答
2

尽管上述答案可行,但您可以使用 .autoreverse|.repeat 选项。那将是一种更清洁的方式。

于 2015-09-23T07:46:38.233 回答
0

好吧,有点神秘,基于我承认的格伦的回答,但这是在 iOS 13 上测试的另一个答案,swift 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 停止它。显然 button 需要是你想要闪烁的 UIButton 距离。

于 2019-12-07T17:47:14.313 回答
0
extension UIImageView{
    func startBlink1() {
        UIView.animate(withDuration: 0.8,
                       delay:0.1,
                       options:[.allowUserInteraction, .curveEaseInOut, .autoreverse, .repeat],
                       animations: { self.alpha = 0.1 },
                       completion: { [self]
                        (value: Bool) in
                        //println(">>> Animation done.")
                        startBlink2()
                       })
    }

    func startBlink2() {
        UIView.animate(withDuration: 0.8,
                       delay:0.1,
                       options:[.allowUserInteraction, .curveEaseInOut, .autoreverse, .repeat],
                       animations: { self.alpha = 1.0 },
                       completion: { [self]
                        (value: Bool) in
                        startBlink1()
                       })
    }
    
    func stopBlink() {
        layer.removeAllAnimations()
        alpha = 1
    }
}
于 2020-10-04T15:31:01.747 回答
0

我就是这样做的:

var flashDuration: TimeInterval = 0.75

override func viewDidLoad() {
    super.viewDidLoad()

    startFlashingButton()
}

func startFlashingButton() {

    flashingButton.alpha = 0.0

    UIButton.animate(withDuration: flashDuration, animations: {

        self.flashingButton.alpha = 1.0

        }, completion: { (_) in

            self.repeatFlash()
    })
}

func repeatFlash() {

    UIButton.animate(withDuration: self.flashDuration, animations: {

        self.flashingButton.alpha = 0.0

        }, completion: { (_) in

            if self.flashDuration == 0.75 {

                self.startFlashingButton()
            }
    })
}

这将一直持续到应用程序被杀死,但如果您想手动停止它,您可以更改flashDuration = 0.0

func someReasonToStopFlash() {

    flashDuration = 0.0
}

并重新开始:

func yourReasonToStartItAgain() {

    flashDuration = 0.75
    startFlashingButton()
}
于 2019-12-24T11:10:21.457 回答