2016-09-16 15 views
1

iOS 10以降、レイアウトの変更にアニメーションが適用されています(layoutIfNeeded())がアニメーション化されていません。以下は、iOS 9以降でうまく動作するUIView拡張機能です。iOS 10のアニメーションバグ

func slideIn(from edgeConstraint: NSLayoutConstraint, withDuration duration: Double = 0.25, finishedAnimating: (() -> Void)? = nil) { 
    dispatch_async(dispatch_get_main_queue()) { 
     edgeConstraint.constant = 0 
     UIView.animateWithDuration(duration, 
      delay: 0.0, 
      options: .BeginFromCurrentState, 
      animations: { self.layoutIfNeeded() }, 
      completion: { didComplete in 
       finishedAnimating?() 
     }) 
    } 
} 

func slideOut(from edgeConstraint: NSLayoutConstraint, withDuration duration: Double = 0.25, finishedAnimating: (() -> Void)? = nil) { 
    dispatch_async(dispatch_get_main_queue()) { 
     edgeConstraint.constant = -self.frame.height 
     UIView.animateWithDuration(duration, 
      delay: 0.0, 
      options: .BeginFromCurrentState, 
      animations: { self.layoutIfNeeded() }, 
      completion: { didComplete in 
       finishedAnimating?() 
     }) 
    } 
} 

誰もがアニメーション化していない理由を知っていますか?

+0

view.superview?.layoutIfNeeded()のようにコールする必要があります本当のデバイス? –

+0

@DanLevyはいiPhone 6S iOS 10.0.1 – SeanRobinson159

+0

「正しく動作しない」とはどういう意味ですか? – Aaron

答えて

11

アニメーションブロックでは、self.layoutIfNeeded()を呼び出しています。ここで、selfは、アニメーション化するUIViewのインスタンスです。 layoutIfNeeded()を呼び出すと、メソッドが呼び出されたビューが再描画され、サブビューの場合はすべてが再描画されます。あなたのケースでは、UIViewを再描画したくない場合は、ビューのスーパービューを再描画します。

あなたの関数は、理にかなって、それらがビューコントローラで呼び出された場合、正常に動作しますが、それらはUIView自体の延長で呼び出されているので、あなたはまた、上の問題を抱えている何か

+0

それがうまくいった。しかし、なぜsuperviewを参照せずにiOS 9で動作したのですか?今はiOS 10ではsuperviewを指定する必要がありますか? – SeanRobinson159

+0

バグはOSに依存していないはずですので、iOS 9で動作する理由がわかりません。 – Aaron

+0

実際にはOSに依存しません。これは実際には9と古いバージョンで動作するために使用されます。以前のバグで修正されたこの新しい動作がiOS10に導入されました - http://stackoverflow.com/a/39548367/1045672 - アップルリリースノートをご覧ください。 – Teffi