Сделать простую анимацию в Swift?


Я пытаюсь сделать простую анимацию в Swift. Это затухание.

Я попытался:

self.myFirstLabel.alpha = 0
self.myFirstButton.alpha = 0
self.mySecondButton.alpha = 0

тогда у меня есть:

self.view.addSubview(myFirstLabel)
self.view.addSubview(myFirstButton)
self.view.addSubview(mySecondButton)

и затем:

UIView.animateWithDuration(1.5, animations: {
 self.myFirstLabel.alpha = 1.0
 self.myFirstButton.alpha = 1.0
 self.mySecondButton.alpha = 1.0
})

у меня все это в метод viewDidLoad.

как я могу сделать эту работу?

4 57

4 ответа:

проблема в том, что вы пытаетесь запустить анимацию слишком рано в жизненном цикле контроллера представления. В viewDidLoad представление только что было создано и еще не добавлено в иерархию представлений, поэтому попытка анимировать одно из его подвидов на этом этапе приводит к плохим результатам.

то, что вы действительно должны делать, это продолжать устанавливать Альфа представления в viewDidLoad (или где вы создаете свои представления), а затем ждать вызова метода viewDidAppear:. При этом точка, вы можете начать анимацию без каких-либо проблем.

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


    UIView.animateWithDuration(1.5, animations: {
        self.myFirstLabel.alpha = 1.0
        self.myFirstButton.alpha = 1.0
        self.mySecondButton.alpha = 1.0
    })
}

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

}

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

таким образом, вы, где в вашем коде, вы можете:

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

повторное использование кода-это важно!

Свифт единственным решением

аналогично лука Анвер, я использую

Если вы хотите повторить исчезают анимации вы можете сделать это с помощью 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: kCAMediaTimingFunctionEaseInEaseOut)
        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)