5

我正在尝试在弹出窗口中重现可导航视图的 iTunes 11 行为。不过,我似乎无法找到一种方法让我的动画在弹出框的contentSize变化发生的同时发生。

我的基本设置是一个自定义视图子类 MyPopoverNavigationView ,它有两个子视图:我希望弹出框在旧视图和新视图之间导航。弹出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];

据我从 Auto Layout WWDC 2012 视频中可以看出,这是推荐的方法,因为约束更改而对视图帧的更改进行动画处理。它可以工作,但动画分两个阶段进行:

  • 首先,弹出框contentSize将更改以适应我要移动到的新视图(该视图变得可见之前,因此它会部分遮盖现有内容)。
  • 其次,视图按照我的预期进行动画处理,从而满足我安装的约束系统。

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

如何让我的视图与弹出框的大小变化一起动画?

4

2 回答 2

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;
于 2013-02-14T18:10:24.790 回答
0

这对我在 Sierra 上很好用:

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)
})
于 2017-10-26T06:09:45.323 回答