cocoa - 动画自动布局更改与 NSPopover contentSize 更改同时发生

标签 cocoa animation autolayout nspopover

我正在尝试在弹出窗口中重现可导航 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/

相关文章:

objective-c - osx - 如何实现没有可见 UI 的 OSX 服务?

ios - UIView 动画 - 展开时意外发现 nil

c# - 为什么绑定(bind)不适用于动画?

ios - 如何使用自动布局并将多个 UI 标签包装成一行?

ios - 当textField有输入文本时如何更新约束

objective-c - Mac OS X 上 Netscape 插件的打开/保存对话框?

iphone - NSDictionary 的字节大小

macos - 是否可以通过编程方式为 OS X 打开/关闭 "do not disturb"

ios - UIView animateWithDuration 使应用程序在从 dispatch_async block 调用时挂起

swift - 更新约束时如何避免 UICollectionView 中的淡入淡出动画