2013-02-09 90 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) 
})