How to make a button flash or blink?

前端 未结 12 1035
不思量自难忘°
不思量自难忘° 2021-02-01 06:17

I am trying to change a button\'s color (just a flash/blink) to green when a scan is correct and red when there\'s a problem. I am able to do this with a view like so

         


        
相关标签:
12条回答
  • 2021-02-01 06:51

    This will start and stop a flashing button onClick, if you only want to flash the button immediately just use the first statement.

    var flashing = false
    
    @IBAction func btnFlash_Clicked(sender: AnyObject) {
            if !flashing{
                self.buttonScan.alpha = 1.0
                UIView.animateWithDuration(0.5, delay: 0.0, options: [.CurveEaseInOut, .Repeat, .Autoreverse, .AllowUserInteraction], animations: {() -> Void in
                    self.buttonScan.alpha = 0.0
                    }, completion: {(finished: Bool) -> Void in
                })
    
                flashing = true
            }
        else{
            UIView.animateWithDuration(0.1, delay: 0.0, options: [.CurveEaseInOut, .BeginFromCurrentState], animations: {() -> Void in
                self.buttonScan.alpha = 1.0
                }, completion: {(finished: Bool) -> Void in
            })
        }
    }
    

    Swift 5.x version

    An updated version with extension.

    extension UIView {
        func blink(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, alpha: CGFloat = 0.0) {
            UIView.animate(withDuration: duration, delay: delay, options: [.curveEaseInOut, .repeat, .autoreverse], animations: {
                self.alpha = alpha
            })
        }
    }
    

    To call the function:

    button.blink() // without parameters
    button.blink(duration: 1, delay: 0.1, alpha: 0.2) // with parameters
    
    0 讨论(0)
  • 2021-02-01 06:52

    with UIViewPropertyAnimator and Swift 5

    UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1, delay: 0, options: [.curveLinear,.repeat], animations: {
           UIView.setAnimationRepeatCount(3000)
           self.buttonScan.alpha = 0.0
     }, completion: {_ in   })
    
    0 讨论(0)
  • 2021-02-01 06:56

    This UIView extension "blinks" a view and changes the background colour:

    /**
     Blinks a view with a given duration and optional color.
    
     - Parameter duration: The duration of the blink.
     - Parameter color: The color of the blink.
     */
    public func blink(withDuration duration: Double = 0.25, color: UIColor? = nil) {
    
        alpha = 0.2
        UIView.animate(withDuration: duration, delay: 0.0, options: [.curveEaseInOut], animations: {
            self.alpha = 1.0
        })
    
        guard let newBackgroundColor = color else { return }
        let oldBackgroundColor = backgroundColor
    
        UIView.animate(withDuration: duration, delay: 0.0, options: [.curveEaseInOut], animations: {
            self.backgroundColor = newBackgroundColor
            self.backgroundColor = oldBackgroundColor
        })
    
    }
    

    You would then use as follows:

    buttonScan.blink(color: .green)
    
    0 讨论(0)
  • 2021-02-01 06:56
    myButton.alpha = 0.7
    
    UIView.animate(withDuration: 0.3,
                          delay: 1.0,
                        options: [UIView.AnimationOptions.curveLinear, UIView.AnimationOptions.repeat, UIView.AnimationOptions.autoreverse],
                     animations: { myButton.alpha = 1.0 },
                     completion: nil)
    
    0 讨论(0)
  • 2021-02-01 07:03

    Swift 3.0

    func animateFlash() {        
        flashView.alpha = 0
        flashView.isHidden = false
        UIView.animate(withDuration: 0.3, animations: { flashView.alpha = 1.0 }) { finished in flashView.isHidden = true }
    }
    
    0 讨论(0)
  • 2021-02-01 07:03

    Another smoothly animating version for Swift 5:

     public extension UIView {
      func blink(duration: TimeInterval) {
        let initialAlpha: CGFloat = 1
        let finalAlpha: CGFloat = 0.2
        
        alpha = initialAlpha
        
        UIView.animateKeyframes(withDuration: duration, delay: 0, options: .beginFromCurrentState) {
          UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
            self.alpha = finalAlpha
          }
          
          UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
            self.alpha = initialAlpha
          }
        }
      }
    }
    
    0 讨论(0)
提交回复
热议问题