在Swift中简单地淡化动画?

Ben*_*783 74 ios swift

我想在Swift中制作一个简单的动画.这是一个淡入淡出.

我试过:

self.myFirstLabel.alpha = 0
self.myFirstButton.alpha = 0
self.mySecondButton.alpha = 0
Run Code Online (Sandbox Code Playgroud)

然后,我有:

self.view.addSubview(myFirstLabel)
self.view.addSubview(myFirstButton)
self.view.addSubview(mySecondButton)
Run Code Online (Sandbox Code Playgroud)

然后:

UIView.animateWithDuration(1.5, animations: {
 self.myFirstLabel.alpha = 1.0
 self.myFirstButton.alpha = 1.0
 self.mySecondButton.alpha = 1.0
})
Run Code Online (Sandbox Code Playgroud)

我在viewDidLoad函数中拥有所有这些.

我该如何工作?

Mic*_*lum 102

问题是你正在尝试在视图控制器的生命周期中过早地启动动画.在viewDidLoad中,视图刚刚创建,尚未添加到视图层次结构中,因此此时尝试为其中一个子视图设置动画会产生错误结果.

你真正应该做的是继续在viewDidLoad(或你创建视图的地方)设置视图的alpha,然后等待viewDidAppear:方法被调用.此时,您可以毫无问题地开始动画.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    UIView.animate(withDuration: 1.5) {
        self.myFirstLabel.alpha = 1.0
        self.myFirstButton.alpha = 1.0
        self.mySecondButton.alpha = 1.0
    }
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*nzo 42

0x7ffffff的回答是好的,绝对是详尽无遗的.

作为一个加号,我建议你以这种方式制作UIView扩展:

public extension UIView {

  /**
  Fade in a view with a duration

  - parameter duration: custom animation duration
  */
  func fadeIn(duration duration: NSTimeInterval = 1.0) {
    UIView.animateWithDuration(duration, animations: {
        self.alpha = 1.0
    })
  }

  /**
  Fade out a view with a duration

  - parameter duration: custom animation duration
  */
  func fadeOut(duration duration: NSTimeInterval = 1.0) {
    UIView.animateWithDuration(duration, animations: {
        self.alpha = 0.0
    })
  }

}
Run Code Online (Sandbox Code Playgroud)

斯威夫特-3

/// Fade in a view with a duration
/// 
/// Parameter duration: custom animation duration
func fadeIn(withDuration duration: TimeInterval = 1.0) {
    UIView.animate(withDuration: duration, animations: {
        self.alpha = 1.0
    })
}

/// Fade out a view with a duration
///
/// - Parameter duration: custom animation duration
func fadeOut(withDuration duration: TimeInterval = 1.0) {
    UIView.animate(withDuration: duration, animations: {
        self.alpha = 0.0
    })
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在代码中的任何位置:

let newImage = UIImage(named: "")
newImage.alpha = 0 // or newImage.fadeOut(duration: 0.0)
self.view.addSubview(newImage)
... 
newImage.fadeIn()
Run Code Online (Sandbox Code Playgroud)

代码重用很重要!


bud*_*ino 8

Swift唯一的解决方案

Luca 的 anwer类似,我使用了UIView扩展名。与他的解决方案相比,我DispatchQueue.main.async用来确保在主线程上完成动画、alpha用于淡入淡出到特定值的duration参数和用于更清晰代码的可选参数。

extension UIView {
  func fadeTo(_ alpha: CGFloat, duration: TimeInterval = 0.3) {
    DispatchQueue.main.async {
      UIView.animate(withDuration: duration) {
        self.alpha = alpha
      }
    }
  }

  func fadeIn(_ duration: TimeInterval = 0.3) {
    fadeTo(1.0, duration: duration)
  }

  func fadeOut(_ duration: TimeInterval = 0.3) {
    fadeTo(0.0, duration: duration)
  }
}
Run Code Online (Sandbox Code Playgroud)

如何使用它:

// fadeIn() - always animates to alpha = 1.0
yourView.fadeIn()     // uses default duration of 0.3
yourView.fadeIn(1.0)  // uses custom duration (1.0 in this example)

// fadeOut() - always animates to alpha = 0.0
yourView.fadeOut()    // uses default duration of 0.3
yourView.fadeOut(1.0) // uses custom duration (1.0 in this example)

// fadeTo() - used if you want a custom alpha value
yourView.fadeTo(0.5)  // uses default duration of 0.3
yourView.fadeTo(0.5, duration: 1.0)
Run Code Online (Sandbox Code Playgroud)


cs4*_*der 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: animation.rawValue)
        flash.duration = duration
        flash.fromValue = 1 // alpha
        flash.toValue = 0 // alpha
        flash.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        flash.autoreverses = true
        flash.repeatCount = repeatCount

        layer.add(flash, forKey: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用它:

    // 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)
Run Code Online (Sandbox Code Playgroud)