Comment faire clignoter ou clignoter un button?

J'essaie de changer la couleur d'un button (juste un flash / clignotement) à vert quand un balayage est correct et rouge quand il y a un problème. Je suis capable de le faire avec une vue comme ça

func flashBG(){ UIView.animateWithDuration(0.7, animations: { self.view.backgroundColor = UIColor.greenColor() }) } 

Mais avec un button, il rest vert

 func flashBtn(){ UIButton.animateWithDuration(0.5, animations: { self.buttonScan.backgroundColor = UIColor.greenColor() }) } 

J'ai créé le button par code

 func setupScanButton() { let X_Co = (self.view.frame.size.width - 100)/2 let Y_Co = (self.viewForLayer.frame.size.height + 36/2) buttonScan.frame = CGRectMake(X_Co,Y_Co,100,100) buttonScan.layer.borderColor = UIColor.whiteColor().CGColor buttonScan.layer.borderWidth = 2 buttonScan.layer.cornerRadius = 50 buttonScan.setTitle("Scan", forState: .Normal) buttonScan.backgroundColor = UIColor.blueColor() buttonScan.addTarget(self, action: "buttonScanAction", forControlEvents: .TouchUpInside) buttonScan.setTitleColor(UIColor(red:255/255, green: 255/255, blue:255/255, alpha: 1), forState: UIControlState.Normal) self.view.addSubview(buttonScan) } 

Dois-je appeler setupScanButton () à nouveau?

J'espère que cela va résoudre votre problème.

 UIView.animateWithDuration(1.0, delay: 1.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { buttonScan.alpha = 0.0 }, completion: nil) 

Cela va démarrer et arrêter un button clignotant onClick , si vous voulez seulement flasher le button immédiatement, utilisez simplement la première déclaration.

 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 }) } } 

Vous pouvez essayer quelque chose comme ceci:

 extension UIView { func blink() { UIView.animateWithDuration(0.5, //Time duration you want, delay: 0.0, options: [.CurveEaseInOut, .Autoreverse, .Repeat], animations: { [weak self] in self?.alpha = 0.0 }, completion: { [weak self] _ in self?.alpha = 1.0 }) dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(2 * NSEC_PER_SEC)),dispatch_get_main_queue()){ [weak self] in self?.layer.removeAllAnimations() } } } 

Cela devrait fonctionner dans Swift 4

 extension UIView{ func blink() { self.alpha = 0.2 UIView.animate(withDuration: 1, delay: 0.0, options: [.curveLinear, .repeat, .autoreverse], animations: { self.alpha = 1.0 }, completion: nil) } 

}

Swift 3.0

 func btnFlash_Clicked(sender: AnyObject) { if !flashing{ callButton.alpha = 1.0 UIView.animate(withDuration: 0.5, delay: 0.0, options: [.allowUserInteraction], animations: {() -> Void in callButton.alpha = 0.5 }, completion: {(finished: Bool) -> Void in }) flashing = true } else{ flashing = false callButton.alpha = 0.5 UIView.animate(withDuration: 0.5, delay: 0.0, options: [.allowUserInteraction], animations: {() -> Void in callButton.alpha = 1.0 }, completion: {(finished: Bool) -> Void in }) } } 
 myButton.alpha = 0.7 UIView.animateWithDuration(0.3, delay: 1.0, options: [UIViewAnimationOptions.CurveLinear, UIViewAnimationOptions.Repeat, UIViewAnimationOptions.Autoreverse], animations: { myButton.alpha = 1.0 }, completion: nil) 

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 } } 

Swift 4 :

J'ai créé une extension avec quelques options utiles:

 extension UIButton { open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { return self.bounds.contains(point) ? self : nil } func blink(enabled: Bool = true, duration: CFTimeInterval = 1.0, stopAfter: CFTimeInterval = 0.0 ) { enabled ? (UIView.animate(withDuration: duration, //Time duration you want, delay: 0.0, options: [.curveEaseInOut, .autoreverse, .repeat], animations: { [weak self] in self?.alpha = 0.0 }, completion: { [weak self] _ in self?.alpha = 1.0 })) : self.layer.removeAllAnimations() if !stopAfter.isEqual(to: 0.0) && enabled { DispatchQueue.main.asyncAfter(deadline: .now() + stopAfter) { [weak self] in self?.layer.removeAllAnimations() } } } } 

Tout d'abord, j'ai hittest fonction la plus hittest pour activer le toucher aussi quand le button a l' alpha égal à 0.0 ( transparent ) pendant l'animation.

Ensuite, toutes les variables d'input ont une valeur par défaut afin que vous puissiez lancer la méthode blink() sans parameters

J'ai également introduit le paramètre enabled pour démarrer ou arrêter les animations sur votre button.

Enfin, si vous le souhaitez, vous pouvez arrêter l'animation après un certain time avec le paramètre stopAfter .

Usage:

 yourButton.blink() // infinite blink effect with the default duration of 1 second yourButton.blink(enabled:false) // stop the animation yourButton.blink(duration: 2.0) // slowly the animation to 2 seconds yourButton.blink(stopAfter:5.0) // the animation stops after 5 seconds. 

Utilisations typiques:

 yourButton.blink(duration: 1.5, stopAfter:10.0) // your code.. yourButton.blink() // other code.. yourButton.blink(enabled:false)