动画自动布局与NSPopover同时更改contentSize更改
问题描述:
我试图在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:
的酥料饼,这不我的动画组外酥料饼的大小动画的私有方法。我的上下文的持续时间不受尊重,并且在弹出窗口大小更改完成之前,我的动画不会发生。
我怎样才能得到我的意见与酥料饼的大小变化在一起动画?
答
原来的诀窍是明确设置动画和完成块的弹出框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;
答
这对我来说工作正常塞拉利昂:
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)
})
不适合我的工作,优胜美地 – 2015-02-24 18:05:54