Сделать простую анимацию в 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 ответа:
проблема в том, что вы пытаетесь запустить анимацию слишком рано в жизненном цикле контроллера представления. В 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)