2017-03-23 95 views
1

我有一個UIView,我想在0.5秒後顯示,並在0.5秒後再次隱藏,創建一個簡單的動畫。我的代碼如下:使用UIViewPropertyAnimator依次動畫UIView的alpha

let animation = UIViewPropertyAnimator.init(duration: 0.5, curve: .linear) { 
     self.timerBackground.alpha = 1 
     let transition = UIViewPropertyAnimator.init(duration: 0.5, curve: .linear) { 
      self.timerBackground.alpha = 0 
     } 
     transition.startAnimation(afterDelay: 0.5) 
    } 
    animation.startAnimation() 

當我測試它時,沒有任何反應。我認爲這是因爲他們都在同一時間運行,這意味着他們相互抵消,但不是說,「afterDelay」部分應該防止什麼?

如果我分別運行它們,即從隱藏到可見或從隱藏可見,它可以工作,但是當我嘗試按順序運行它們時,它不起作用。

我的UIView不是不透明或隱藏的。

+0

「但不是說」afterDelay「部分應該防止什麼?」不可以。如果您想在動畫之後執行某些操作,請將_completion handler_添加到屬性動畫器中。 https://developer.apple.com/reference/uikit/uiviewpropertyanimator/1648373-addcompletion – matt

回答

0

使用UIView.animateKeyframes如果你有複雜的動畫,你會很好地構建你的代碼。如果您將使用嵌套在其他塊的完成塊內的UIView動畫,它可能會導致可笑的縮進級別和零可讀性。

下面是一個例子:

/* Target frames to move our object to (and animate) 
    or it could be alpha property in your case... */ 

let newFrameOne = CGRect(x: 200, y: 50, width: button.bounds.size.width, height: button.bounds.size.height) 
let newFrameTwo = CGRect(x: 300, y: 200, width: button.bounds.size.width, height: button.bounds.size.height) 

UIView.animateKeyframes(withDuration: 2.0, 
           delay: 0.0, 
          options: .repeat, 
          animations: { _ in 
    /* First animation */          
    UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5, animations: { [weak self] in 
     self?.button.frame = newFrameOne 
    }) 

    /* Second animation */          
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: { [weak self] in 
     self?.button.frame = newFrameTwo 
    }) 

    /* . . . */ 

    }, completion: nil) 
4

您可以使用Timer,並添加出現/隱藏在每一個計時器滴答動畫塊到您的UIViewPropertyAnimator對象。

這裏有一個代碼庫:

@IBOutlet weak var timerBackground: UIImageView! 

private var timer: Timer? 
private var isShown = false 
private var viewAnimator = UIViewPropertyAnimator.init(duration: 0.5, curve: .linear) 

override func viewDidLoad() { 
    super.viewDidLoad() 
    viewAnimator.addAnimations { 
     self.timerBackground.alpha = 1 
    } 
    viewAnimator.startAnimation() 
    isShown = true 

    self.timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.startReversedAction), userInfo: nil, repeats: true) 
} 

func startReversedAction() { 
    // stop the previous animations block if it did not have time to finish its movement 
    viewAnimator.stopAnimation(true) 
    viewAnimator.addAnimations ({ 
     self.timerBackground.alpha = self.isShown ? 0 : 1 
    }) 
    viewAnimator.startAnimation() 
    isShown = !isShown 
} 

我已經實現了非常相似的行爲的iOS 10 Animations demo projectdots jumping

請隨時查看以獲得更多詳細信息。