【问题标题】:Animating Auto Layout changes concurrently with NSPopover contentSize change动画自动布局更改与 NSPopover contentSize 更改同时发生
【发布时间】:2013-02-09 00:51:43
【问题描述】:

我正在尝试在弹出窗口中重现 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: 的私有方法,它在我的动画组之外执行弹出框大小的动画。我的上下文的持续时间没有受到尊重,并且我的动画在弹出框的大小更改完成之前不会发生。

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

【问题讨论】:

    标签: cocoa animation autolayout nspopover


    【解决方案1】:

    原来诀窍是在动画和完成块之外显式设置弹出框的contentSize 属性。来自sample GitHub project 的相关sn-p 我整理出来的样子如下:

    // 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;
    

    【讨论】:

      【解决方案2】:

      这对我在 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)
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 2020-11-08
        相关资源
        最近更新 更多