动画自动布局与NSPopover contentSize更改同时更改

Tim*_*Tim 5 cocoa animation autolayout nspopover

我试图在popover中重现可导航视图的iTunes 11行为.我似乎无法找到一种方法来让我的动画在弹出窗口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];
Run Code Online (Sandbox Code Playgroud)

据我所知,从Auto Layout WWDC 2012视频中,这是一种建议的方法,可以在约束更改的情况下对视图帧的更改进行动画处理.它有效,但动画分两个阶段进行:

  • 首先,popover contentSize将改变以适应我正在移动的新视图(该视图变为可见之前,因此它部分地模糊了现有内容).
  • 其次,视图按照我的预期进行动画处理,以便我安装的约束系统得到满足.

从设置一些断点,它看起来-layoutSubtreeIfNeeded最终调用一个名为popover的私有方法_fromConstraintsSetWindowFrame:,它在我的动画组之外执行popover大小的动画.我的上下文的持续时间不受尊重,我的动画在弹出框的大小更改完成之前不会发生.

如何让我的观点与弹出窗口的大小变化一起动画?

Tim*_*Tim 4

事实证明,诀窍是在动画和完成块之外显式设置弹出窗口属性contentSize我整理的示例 GitHub 项目中的相关片段如下所示:

// 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;
Run Code Online (Sandbox Code Playgroud)