【问题标题】:Scale UIButton Animation- Swift [closed]缩放 UIButton 动画 - Swift [关闭]
【发布时间】:2015-07-09 14:42:05
【问题描述】:

我正在尝试在单击 UIButton 时对其进行缩放动画,但我想要完成的是当单击按钮时我需要将 UIButton 缩小到内部,然后它会恢复原样大小(像一个气泡)。

我尝试了以下方法:

button.transform = CGAffineTransformMakeScale(-1, 1)

UIView.animateWithDuration(0.5, animations: { () -> Void in

    button.transform = CGAffineTransformMakeScale(1,1)

})

【问题讨论】:

  • 当您尝试包含的代码时发生了什么?

标签: ios swift cgaffinetransformscale


【解决方案1】:

试试这个

UIView.animate(withDuration: 0.6,
    animations: {
        self.button.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)
    },
    completion: { _ in
        UIView.animate(withDuration: 0.6) {
            self.button.transform = CGAffineTransform.identity
        }
    })

【讨论】:

  • Swift 3.0: UIView.animate(withDuration: 0.6, 动画: { self.button.transform = CGAffineTransform(scaleX: 0.6, y: 0.6) }, 完成: { (finish: Bool) 在 UIView .animate(withDuration: 0.6, 动画: { self.button.transform = CGAffineTransform.identity }) })
【解决方案2】:

SWIFT 5 代码更新:我有一个动画按钮,具有很好的弹跳效果,带有弹簧动画。

@IBOutlet weak var button: UIButton!

@IBAction func animateButton(sender: UIButton) {

    sender.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)

    UIView.animate(withDuration: 2.0,
                               delay: 0,
                               usingSpringWithDamping: CGFloat(0.20),
                               initialSpringVelocity: CGFloat(6.0),
                               options: UIView.AnimationOptions.allowUserInteraction,
                               animations: {
                                sender.transform = CGAffineTransform.identity
        },
                               completion: { Void in()  }
    )
}

【讨论】:

    【解决方案3】:

    以上所有答案均有效。
    另外,我建议使用 Swift 创建 UIView 的扩展,以便“缩放”您想要的任何视图。
    你可以从这段代码中获得灵感:

    SWIFT 5.0

    extension UIView {
    
    /**
     Simply zooming in of a view: set view scale to 0 and zoom to Identity on 'duration' time interval.
    
     - parameter duration: animation duration
     */
    func zoomIn(duration: TimeInterval = 0.2) {
        self.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
        UIView.animate(withDuration: duration, delay: 0.0, options: [.curveLinear], animations: { () -> Void in
            self.transform = .identity
            }) { (animationCompleted: Bool) -> Void in
        }
    }
    
    /**
     Simply zooming out of a view: set view scale to Identity and zoom out to 0 on 'duration' time interval.
    
     - parameter duration: animation duration
     */
    func zoomOut(duration : TimeInterval = 0.2) {
        self.transform = .identity
        UIView.animate(withDuration: duration, delay: 0.0, options: [.curveLinear], animations: { () -> Void in
            self.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
            }) { (animationCompleted: Bool) -> Void in
        }
    }
    
    /**
     Zoom in any view with specified offset magnification.
    
     - parameter duration:     animation duration.
     - parameter easingOffset: easing offset.
     */
    func zoomInWithEasing(duration: TimeInterval = 0.2, easingOffset: CGFloat = 0.2) {
        let easeScale = 1.0 + easingOffset
        let easingDuration = TimeInterval(easingOffset) * duration / TimeInterval(easeScale)
        let scalingDuration = duration - easingDuration
        UIView.animate(withDuration: scalingDuration, delay: 0.0, options: .curveEaseIn, animations: { () -> Void in
            self.transform = CGAffineTransform(scaleX: easeScale, y: easeScale)
            }, completion: { (completed: Bool) -> Void in
                UIView.animate(withDuration: easingDuration, delay: 0.0, options: .curveEaseOut, animations: { () -> Void in
                    self.transform = .identity
                    }, completion: { (completed: Bool) -> Void in
                })
        })
    }
    
    /**
     Zoom out any view with specified offset magnification.
    
     - parameter duration:     animation duration.
     - parameter easingOffset: easing offset.
     */
    func zoomOutWithEasing(duration: TimeInterval = 0.2, easingOffset: CGFloat = 0.2) {
        let easeScale = 1.0 + easingOffset
        let easingDuration = TimeInterval(easingOffset) * duration / TimeInterval(easeScale)
        let scalingDuration = duration - easingDuration
        UIView.animate(withDuration: easingDuration, delay: 0.0, options: .curveEaseOut, animations: { () -> Void in
            self.transform = CGAffineTransform(scaleX: easeScale, y: easeScale)
            }, completion: { (completed: Bool) -> Void in
                UIView.animate(withDuration: scalingDuration, delay: 0.0, options: .curveEaseOut, animations: { () -> Void in
                    self.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
                    }, completion: { (completed: Bool) -> Void in
                })
        })
    }
    
    }
    

    用法很简单:

    let button = UIButton(frame: frame)
    button.zoomIn() // here the magic
    

    Swift 3 版本

    extension UIView {
    
    /**
     Simply zooming in of a view: set view scale to 0 and zoom to Identity on 'duration' time interval.
    
     - parameter duration: animation duration
     */
    func zoomIn(duration: TimeInterval = 0.2) {
        self.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
        UIView.animate(withDuration: duration, delay: 0.0, options: [.curveLinear], animations: { () -> Void in
            self.transform = CGAffineTransform.identity
        }) { (animationCompleted: Bool) -> Void in
        }
    }
    
    /**
     Simply zooming out of a view: set view scale to Identity and zoom out to 0 on 'duration' time interval.
    
     - parameter duration: animation duration
     */
    func zoomOut(duration: TimeInterval = 0.2) {
        self.transform = CGAffineTransform.identity
        UIView.animate(withDuration: duration, delay: 0.0, options: [.curveLinear], animations: { () -> Void in
            self.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
        }) { (animationCompleted: Bool) -> Void in
        }
    }
    
    /**
     Zoom in any view with specified offset magnification.
    
     - parameter duration:     animation duration.
     - parameter easingOffset: easing offset.
     */
    func zoomInWithEasing(duration: TimeInterval = 0.2, easingOffset: CGFloat = 0.2) {
        let easeScale = 1.0 + easingOffset
        let easingDuration = TimeInterval(easingOffset) * duration / TimeInterval(easeScale)
        let scalingDuration = duration - easingDuration
        UIView.animate(withDuration: scalingDuration, delay: 0.0, options: .curveEaseIn, animations: { () -> Void in
            self.transform = CGAffineTransform(scaleX: easeScale, y: easeScale)
        }, completion: { (completed: Bool) -> Void in
            UIView.animate(withDuration: easingDuration, delay: 0.0, options: .curveEaseOut, animations: { () -> Void in
                self.transform = CGAffineTransform.identity
            }, completion: { (completed: Bool) -> Void in
            })
        })
    }
    
    /**
     Zoom out any view with specified offset magnification.
    
     - parameter duration:     animation duration.
     - parameter easingOffset: easing offset.
     */
    func zoomOutWithEasing(duration: TimeInterval = 0.2, easingOffset: CGFloat = 0.2) {
        let easeScale = 1.0 + easingOffset
        let easingDuration = TimeInterval(easingOffset) * duration / TimeInterval(easeScale)
        let scalingDuration = duration - easingDuration
        UIView.animate(withDuration: easingDuration, delay: 0.0, options: .curveEaseOut, animations: { () -> Void in
            self.transform = CGAffineTransform(scaleX: easeScale, y: easeScale)
        }, completion: { (completed: Bool) -> Void in
            UIView.animate(withDuration: scalingDuration, delay: 0.0, options: .curveEaseOut, animations: { () -> Void in
                self.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
            }, completion: { (completed: Bool) -> Void in
            })
        })
    }
    
    }
    

    【讨论】:

      【解决方案4】:

      Swift 3.x+

      extension UIButton {
      
              func pulsate() {
      
                  let pulse = CASpringAnimation(keyPath: "transform.scale")
                  pulse.duration = 0.2
                  pulse.fromValue = 0.95
                  pulse.toValue = 1.0
                  pulse.autoreverses = true
                  pulse.repeatCount = 2
                  pulse.initialVelocity = 0.5
                  pulse.damping = 1.0
      
                  layer.add(pulse, forKey: "pulse")
              }
      
              func flash() {
      
                  let flash = CABasicAnimation(keyPath: "opacity")
                  flash.duration = 0.2
                  flash.fromValue = 1
                  flash.toValue = 0.1
                  flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
                  flash.autoreverses = true
                  flash.repeatCount = 3
      
                  layer.add(flash, forKey: nil)
              }
      
      
              func shake() {
      
                  let shake = CABasicAnimation(keyPath: "position")
                  shake.duration = 0.05
                  shake.repeatCount = 2
                  shake.autoreverses = true
      
                  let fromPoint = CGPoint(x: center.x - 5, y: center.y)
                  let fromValue = NSValue(cgPoint: fromPoint)
      
                  let toPoint = CGPoint(x: center.x + 5, y: center.y)
                  let toValue = NSValue(cgPoint: toPoint)
      
                  shake.fromValue = fromValue
                  shake.toValue = toValue
      
                  layer.add(shake, forKey: "position")
              }
          }
      

      用法:

      myButton.flash()
      // myButton.pulsate()
      // myButton.shake()
      

      致谢:Sean Allen

      【讨论】:

        【解决方案5】:

        Swift 3 版本:

            UIView.animate(withDuration: 0.6, animations: {
                button.transform = CGAffineTransform.identity.scaledBy(x: 0.6, y: 0.6)
                }, completion: { (finish) in
                    UIView.animate(withDuration: 0.6, animations: {
                        button.transform = CGAffineTransform.identity
                    })
            })
        

        【讨论】:

          【解决方案6】:

          使用 Swift 4 Xcode 9,这将使按钮在最初按下时向下动画,然后在释放时返回。

          extension UIView {
          
          func animateButtonDown() {
          
              UIView.animate(withDuration: 0.1, delay: 0.0, options: [.allowUserInteraction, .curveEaseIn], animations: {
                  self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
              }, completion: nil)
          }
          
          func animateButtonUp() {
          
              UIView.animate(withDuration: 0.1, delay: 0.0, options: [.allowUserInteraction, .curveEaseOut], animations: {
                  self.transform = CGAffineTransform.identity
              }, completion: nil)
          }
          

          实施:

          @IBAction func buttonTouchDown(_ sender: UIButton) {
              //Connected with Touch Down Action
              sender.animateButtonDown()
          }
          
          @IBAction func buttonTouchUpOutside(_ sender: UIButton) {
              //Connected with Touch Up Outside Action
              //if touch moved away from button
              sender.animateButtonUp()
          }
          
          @IBAction func buttonTouchUpInside(_ sender: UIButton) {
              //Connected with Touch Up Inside Action
              sender.animateButtonUp()
              //code to execute when button pressed
          }
          

          【讨论】:

            【解决方案7】:

            它与我的工作如下,动画设置为小然后当它开始动画时它会恢复到原来的大小:

            斯威夫特 2

            button.transform = CGAffineTransformMakeScale(0.6, 0.6)
            
            UIView.animateWithDuration(0.3, animations: { () -> Void in
            
                button.transform = CGAffineTransformMakeScale(1,1)
            
            })
            

            斯威夫特 3、4、5

            button.transform = CGAffineTransform.init(scaleX: 0.6, y: 0.6)
            
            UIView.animate(withDuration: 0.3, animations: { () -> Void in
            
                button.transform = CGAffineTransform.init(scaleX: 1, y: 1)
            
            })
            

            【讨论】:

            • 您的代码立即将按钮的大小设置为 0.6,然后将其动画恢复为原始大小。但是,如果您想动画到 0.6,然后再动画回原始大小。看看我的回答。
            【解决方案8】:

            我更喜欢按下动画并设置它比其他示例更快,完成控制等待动画结束:

            Swift 3

            extension UIButton {
               func press(completion:@escaping ((Bool) -> Void)) {
                        UIView.animate(withDuration: 0.05, animations: {
                            self.transform = CGAffineTransform(scaleX: 0.8, y: 0.8) }, completion: { (finish: Bool) in
                                UIView.animate(withDuration: 0.1, animations: {
                                    self.transform = CGAffineTransform.identity
                                    completion(finish)
                                })
                        })
                }
            }
            

            用法

            @IBAction func playPauseBtnTap(_ sender: Any) {
                 let playPauseBtn = sender as! UIButton
                 playPauseBtn.press(completion:{ finish in
                     if finish {
                         print("animation ended")
                     }
                 }
            }
            

            【讨论】:

            • 很好地利用完成在线程上启动东西,而没有那个可笑的旋转圈废话
            【解决方案9】:

            使用以下动画,按钮将从其全尺寸开始,通过弹簧动画减小到 0.6 以弹回其全尺寸。

            [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.4 initialSpringVelocity:0.3 options:0 animations:^{
                            //Animations
                            button.transform = CGAffineTransformIdentity;
                            CGAffineTransformMakeScale(0.6, 0.6)
                        } completion:^(BOOL finished) {
                            //Completion Block
                        [UIView.animateWithDuration(0.5){
                        button.transform = CGAffineTransformIdentity
                         }];
                        }];
            

            【讨论】:

              【解决方案10】:

              如果你想要一个带有完成处理程序的自动反转效果,你可以试试这个。

              viewToAnimate.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
                      UIView.animate(withDuration: 0.7, // your duration
                                     delay: 0,
                                     usingSpringWithDamping: 0.2,
                                     initialSpringVelocity: 6.0,
                                     animations: { _ in
                                     viewToAnimate.transform = .identity
                          },
                                     completion: { _ in
                                      // Implement your awesome logic here.
                      })
              

              【讨论】:

                【解决方案11】:

                iOS 9 和 xCode 7

                //for zoom in
                    [UIView animateWithDuration:0.5f animations:^{
                
                        self.sendButton.transform = CGAffineTransformMakeScale(1.5, 1.5);
                    } completion:^(BOOL finished){}];
                // for zoom out
                        [UIView animateWithDuration:0.5f animations:^{
                
                            self.sendButton.transform = CGAffineTransformMakeScale(1, 1);
                        }completion:^(BOOL finished){}];
                

                【讨论】:

                  【解决方案12】:

                  这将产生美妙的弹跳效果:

                  @IBAction func TouchUpInsideEvent(sender: UIButton) {
                      UIView.animateWithDuration(2.0,
                                                 delay: 0,
                                                 usingSpringWithDamping: CGFloat(0.20),
                                                 initialSpringVelocity: CGFloat(6.0),
                                                 options: UIViewAnimationOptions.AllowUserInteraction,
                                                 animations: {
                                                  sender.transform = CGAffineTransformIdentity
                          },
                                                 completion: { Void in()  }
                      )
                  }
                  
                  
                  @IBAction func touchDownEvent(sender: UIButton) {
                      UIView.animateWithDuration(0.15, animations: {
                          sender.transform = CGAffineTransformMakeScale(0.6, 0.6)
                      })
                  
                  }
                  

                  【讨论】:

                    【解决方案13】:

                    缩放按钮或任何视图大约三倍或更多使用以下代码。 swift 3 或 swift 4 与 xcode 9。

                     UIView.animate(withDuration: 0.2, animations: {
                            self.cartShowHideBtnView.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
                    
                        }, completion: { (finish: Bool) in
                                UIView.animate(withDuration: 0.2, animations: {
                                    self.cartShowHideBtnView.transform = CGAffineTransform.identity
                    
                                }, completion:{(finish: Bool) in
                                    UIView.animate(withDuration: 0.2, animations: {
                                        self.cartShowHideBtnView.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
                    
                                    }, completion: { (finish: Bool) in
                                        UIView.animate(withDuration: 0.2, animations: {
                                            self.cartShowHideBtnView.transform = CGAffineTransform.identity
                    
                                        }, completion:{(finish: Bool) in
                                            UIView.animate(withDuration: 0.2, animations: {
                                                self.cartShowHideBtnView.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
                    
                                            }, completion: { (finish: Bool) in
                                                UIView.animate(withDuration: 0.2, animations: {
                                                    self.cartShowHideBtnView.transform = CGAffineTransform.identity
                                            })
                                        })
                                    })
                                })
                            })
                        })
                    

                    【讨论】:

                      【解决方案14】:

                      我使用 Swift 4 做了一个协议,你可以在一些你想要动画的 UIViews 上使用它……你可以在这里尝试一些动画或者改变时间和延迟。

                      推荐这种方式,因为您可以在一个视图中使用此协议和其他协议,并且此视图可以使用此功能,从 UIView 做很多 os 扩展会产生代码异味。

                      import Foundation
                      import UIKit
                      
                      protocol Showable where Self: UIView {}
                      
                      extension Showable {
                      
                          func show(_ view: UIView? = nil) {
                      
                              if let view = view {
                                  self.animate(view)
                              } else {
                                  self.animate(self)
                              }
                          }
                      
                          private func animate(_ view: UIView) {
                              view.transform = CGAffineTransform(scaleX: 0.0, y: 0.0)
                      
                              UIView.animate(withDuration: 2.0,
                                             delay: 0,
                                             usingSpringWithDamping: CGFloat(0.20),
                                             initialSpringVelocity: CGFloat(6.0),
                                             options: [.allowUserInteraction],
                                             animations: {
                                              view.transform = CGAffineTransform.identity
                              })
                          }
                      }
                      

                      【讨论】:

                      • 请同时添加一个使用这个扩展的例子。
                      【解决方案15】:

                      这是一个工作示例:

                      extension  UIButton{
                        func flash() {
                          let flash = CABasicAnimation(keyPath: "opacity")
                          flash.duration = 0.5
                          flash.fromValue = 1
                          flash.toValue = 0.1
                          flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
                          flash.autoreverses = true
                          flash.repeatCount = 3
                          layer.add(flash, forKey: nil)
                        }
                      }
                      
                      @IBAction func taptosave(_ sender: UIButton) {
                        sender.flash()
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-09-08
                        • 2015-12-02
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多