2013-02-09 89 views
5

我試圖在popover內重現導航視圖的iTunes 11行爲。不過,我似乎無法找到一種方法,讓我的動畫在發生變化時同時發生。動畫自動佈局與NSPopover同時更改contentSize更改

基本設置我是一個自定義視圖子類MyPopoverNavigationView有兩個子視圖:我希望新老並享有酥料餅之間導航。 popover的contentViewController有一個MyPopoverNavigationView實例作爲它的view。我這樣做:

// Configure constraints how I want them to show the new popover view 
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) { 
    [ctx setDuration:0.25]; 
    [ctx setAllowsImplicitAnimation:YES]; 
    [self layoutSubtreeIfNeeded]; 
} completionHandler:nil]; 

據我可以從自動佈局WWDC 2012的視頻告訴,這是動畫作爲約束變化的結果改變意見框架的推薦方式。它的工作原理,但動畫發生在兩個階段:

  • 首先,酥料餅的contentSize將改變,以適應我移動到(這一觀點可見之前,新的觀點,所以它部分地掩蓋了現有內容)。
  • 其次,我認爲動畫的意見,使我安裝的約束系統得到滿足。

從設置一些斷點,它看起來像-layoutSubtreeIfNeeded最終調用名爲_fromConstraintsSetWindowFrame:的酥料餅,這不我的動畫組外酥料餅的大小動畫的私有方法。我的上下文的持續時間不受尊重,並且在彈出窗口大小更改完成之前,我的動畫不會發生。

我怎樣才能得到我的意見與酥料餅的大小變化在一起動畫?

回答

4

原來的訣竅是明確設置動畫和完成塊的彈出框contentSize屬性外部。從sample GitHub project我放在一起,弄清楚有關片段是這樣的:

// Configure constraints for post-navigation view layout 
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) { 
    [ctx setDuration:0.25]; 
    [ctx setAllowsImplicitAnimation:YES]; 
    [self layoutSubtreeIfNeeded]; 
} completionHandler:^{ 
    // Tear down some leftover constraints from before the transition 
}]; 

// Explicitly set popover's contentSize so its animation happens simultaneously 
containingPopover.contentSize = postTransitionView.frame.size; 
+1

不適合我的工作,優勝美地 – 2015-02-24 18:05:54

0

這對我來說工作正常塞拉利昂:

let deltaHeight = 8 
let contentSize = popover.contentSize 
NSAnimationContext.runAnimationGroup({ (context) -> Void in 
    context.allowsImplicitAnimation = true 
    popover.contentSize = NSSize(width: contentSize.width, height: contentSize.height+deltaHeight) 
})