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