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视频中,这是一种建议的方法,可以在约束更改的情况下对视图帧的更改进行动画处理.它有效,但动画分两个阶段进行:
contentSize将改变以适应我正在移动的新视图(在该视图变为可见之前,因此它部分地模糊了现有内容).从设置一些断点,它看起来-layoutSubtreeIfNeeded最终调用一个名为popover的私有方法_fromConstraintsSetWindowFrame:,它在我的动画组之外执行popover大小的动画.我的上下文的持续时间不受尊重,我的动画在弹出框的大小更改完成之前不会发生.
如何让我的观点与弹出窗口的大小变化一起动画?
事实证明,诀窍是在动画和完成块之外显式设置弹出窗口的属性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)