【问题标题】:Swift Infinite Fade in and Out LoopSwift 无限淡入淡出循环
【发布时间】:2016-10-19 23:11:48
【问题描述】:

我怎样才能在 swift 中产生类似这样的效果:

我希望动画永远循环播放。

【问题讨论】:

    标签: xcode swift animation swift2 infinite-loop


    【解决方案1】:

    适用于 iOS

    UIViewAnimationOptions 集提供了不同的方便选项来实现漂亮和复杂动画的组合。对于您的特定场景,您将需要两个选项。

    UIViewAnimationOptions.Repeat
    UIViewAnimationOptions.AutoReverse
    

    查看下面的代码实现。

    代码

    class MyViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
            view.backgroundColor = UIColor.blueColor()
            self.view.addSubview(view)
    
            UIView.animateWithDuration(1, 
            delay: 0, 
            options: [UIViewAnimationOptions.Autoreverse, UIViewAnimationOptions.Repeat], 
            animations: {
                  view.backgroundColor = UIColor.clearColor()
              }, 
            completion: nil)
        }
    
    }
    

    解释: 我已经为演示目的创建了一个带有特定框架的视图。

    您感兴趣的部分是UIView.animateWithDuration 方法。请注意,我在options 参数中提供了一个数组[UIViewAnimationOptions.AutoReverse, UIViewAnimationOptions.Repeat]

    这两个选项足以实现如下所示的平滑且永久循环的动画。 https://s3.amazonaws.com/uploads.hipchat.com/37040/1764070/6Iow7n7WiWf6Naz/autoReverse.gif

    如果您不想反转动画,只需从options 参数中的数组中删除UIViewAnimationOptions.AutoReverse。你会得到这样的动画。 https://s3.amazonaws.com/uploads.hipchat.com/37040/1764070/8fyRUlzqNHSQI47/noreverse.gif

    【讨论】:

    • 如何让标签做到这一点?
    • UILabel 是 UIView 的子类。因此它的过程相同。因此,不要使用我在代码中使用的视图,而是将其替换为 UILabel。
    • 你能帮我做吗?我在理解这段代码时有点困难。
    • 让 label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) label.backgroundColor = UIColor.blueColor() self.view.addSubview(label ) UIView.animateWithDuration(1, delay: 0, options: [UIViewAnimationOptions.Autoreverse, UIViewAnimationOptions.Repeat], 动画: { label.backgroundColor = UIColor.clearColor() }, 完成: nil)
    • 将上面的代码复制并粘贴到您的 viewDidLoad 方法中并观察它的工作情况。另请查看我编辑的答案。 :)
    【解决方案2】:

    适用于 iOS

    viewSquare 成为您问题中蓝色方块的名称。

    UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat,.autoreverse], animations: {
                viewSquare.alpha = 0.0
            }, completion: nil)
    

    【讨论】:

      【解决方案3】:

      斯威夫特 5.1

      let duration = 0.5
      
      
      func fadeIn(finished: Bool) {
          UIView.animate(withDuration: self.duration, delay: 0,
                         options: [.curveEaseInOut],
                         animations: { self.tftMap.alpha = 1 }, completion: self.fadeOut)
      }
      
      func fadeOut(finished: Bool) {
          UIView.animate(withDuration: self.duration, delay: 0,
                         options: [.curveEaseInOut],
                         animations: { self.tftMap.alpha = 0 }, completion: self.fadeIn)
      }
      

      【讨论】:

        【解决方案4】:

        我假设你正在为 iOS 编程。

        试试duration 看看最适合你的:

        class ViewController: UIViewController {
            @IBOutlet weak var myView: UIView!
            let duration = 0.5
        
            override func viewDidLoad() {
                super.viewDidLoad()
                self.fadeOut(true)
            }
        
            override func didReceiveMemoryWarning() {
                super.didReceiveMemoryWarning()
            }
        
            func fadeIn(finished: Bool) {
                UIView.animateWithDuration(self.duration, delay: 0, options: [.CurveEaseInOut], animations: { self.myView.alpha = 1 } , completion: self.fadeOut)
            }
        
            func fadeOut(finished: Bool) {
                UIView.animateWithDuration(self.duration, delay: 0, options: [.CurveEaseInOut], animations: { self.myView.alpha = 0 } , completion: self.fadeIn)
            }
        }
        

        【讨论】:

        • 您可能想查看.Repeat.Autoreverse 动画选项。
        • 如何让标签做到这一点?
        【解决方案5】:

        斯威夫特 5

        这对我来说效果很好。我想为标签的连续淡入淡出制作动画,我将其放置在“cardHeaderView”UIView 中。

        @IBOutlet weak var cardHeaderView: UIView!
        

        把它放在“viewDidAppear”里面。我的延迟为零,因此动画会立即开始。

        fadeViewInThenOut(view: cardHeaderView, delay: 0)
        

        这里是函数。

        func fadeViewInThenOut(view : UIView, delay: TimeInterval) {
        
            let animationDuration = 1.5
        
            UIView.animate(withDuration: animationDuration, delay: delay, options: [UIView.AnimationOptions.autoreverse, UIView.AnimationOptions.repeat], animations: {
                view.alpha = 0
            }, completion: nil)
        
        }
        

        【讨论】:

          【解决方案6】:

          如果您想要可重复的淡入淡出动画,您可以使用CABasicAnimation 来实现,如下所示:

          ###首先创建方便的 UIView 扩展:

          extension UIView {
          
              enum AnimationKeyPath: String {
                  case opacity = "opacity"
              }
          
              func flash(animation: AnimationKeyPath ,withDuration duration: TimeInterval = 0.5, repeatCount: Float = 5){
                 let flash = CABasicAnimation(keyPath: AnimationKeyPath.opacity.rawValue)
                 flash.duration = duration
                  flash.fromValue = 1 // alpha
                  flash.toValue = 0 // alpha
                  flash.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
                  flash.autoreverses = true
                  flash.repeatCount = repeatCount
          
                  layer.add(flash, forKey: nil)
              }
          }
          

          ###如何使用:

              // You can use it with all kind of UIViews e.g. UIButton, UILabel, UIImage, UIImageView, ...
              imageView.flash(animation: .opacity, withDuration: 1, repeatCount: 5)
              titleLabel.flash(animation: .opacity, withDuration: 1, repeatCount: 5)
          

          【讨论】:

            猜你喜欢
            • 2012-09-29
            • 1970-01-01
            • 1970-01-01
            • 2021-03-07
            • 1970-01-01
            • 1970-01-01
            • 2014-12-21
            • 2013-07-14
            • 2014-06-12
            相关资源
            最近更新 更多