2016-09-16 61 views
1

自iOS 10以來我注意到動畫布局更改(layoutIfNeeded())並非動畫。這是我的UIView擴展,它在iOS 9和更低版本上效果很好。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

你也有一個問題,真正的設備? –

+0

@DanLevy是的iPhone 6S的iOS 10.0.1 – SeanRobinson159

+0

你是什麼意思的「不正確的工作」? – Aaron

回答

11

在你的動畫塊你打電話self.layoutIfNeeded()其中self是要設置動畫的UIView實例。調用layoutIfNeeded()會重新繪製該方法被調用的視圖以及全部(如果是子視圖)。在你的情況下,你不想重畫UIView,你想重畫視圖的超級視圖。

你的功能將使意義和正常工作,如果他們被稱爲在一個視圖控制器,但是,因爲他們被稱爲在上UIView本身的擴展,您需要調用類似view.superview?.layoutIfNeeded()

+0

因此,工作。但是,爲什麼它沒有提到超級視圖就在iOS 9上工作,現在在iOS 10上我必須指定超級視圖? – SeanRobinson159

+0

該錯誤應該是操作系統不可知的,所以我不確定它爲什麼會在iOS 9上工作。 – Aaron

+0

它實際上並不是OS不可知的。這用於真正在9和更舊版本上工作。這個新行爲在iOS10上引入之前已經修復了一個bug - http://stackoverflow.com/a/39548367/1045672 - 請參閱Apple發行說明。 – Teffi