我正在尝试在弹出窗口中重现可导航 View 的 iTunes 11 行为。不过,我似乎找不到一种方法让我的动画在弹出窗口的 contentSize
更改发生的同时发生。
我的基本设置是一个自定义 View 子类 MyPopoverNavigationView,它有两个 subview :我希望弹出窗口在旧 View 和新 View 之间导航。弹出窗口的 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 视频中得知,这是由于约束更改而对 View 帧进行动画更改的推荐方法。它有效,但动画分两个阶段发生:
- 首先,弹出窗口的
contentSize
将发生变化,以适应我要移动到的新 View (在该 View 变得可见之前,因此它会部分遮挡现有内容) . - 其次, View 按照我的预期进行动画处理,从而满足我安装的约束系统。
从设置一些断点来看,-layoutSubtreeIfNeeded
最终在弹出窗口上调用了一个名为_fromConstraintsSetWindowFrame:
的私有(private)方法,该方法在我的动画组之外执行弹出窗口大小动画。我的上下文的持续时间不受尊重,并且在弹出窗口的大小更改完成之前我的动画不会发生。
如何让我的 View 随着弹出框大小的变化而动画化?
最佳答案
事实证明,技巧是在动画和完成 block 的外部显式设置弹出窗口的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;
关于cocoa - 动画自动布局更改与 NSPopover contentSize 更改同时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14783711/