【问题标题】:Resize animation with auto-layout and "jumpy" focus rings使用自动布局和“跳跃”聚焦环调整动画大小
【发布时间】:2018-11-07 09:05:06
【问题描述】:

我正在开发一个 macOS 应用程序,该应用程序在具有图层支持的视图的视图层次结构中使用自动布局。该应用程序使用带有多个子视图的NSStackView,每个子视图都有一个折叠/展开按钮来调整相应子视图的大小。子视图的大小调整是通过添加和删除布局约束来实现的,并且动画上下文用于动画大小变化。我按照WWDC 2013, Session 213, starting at about minute 29 的演示实现了这一点:

@objc func disclosureToggeled(_ sender : Any) {
    if isCollapsed {
        self.addConstraint(collapseConstraint)
    }
    else {
        self.removeConstraint(collapseConstraint)
    }

    NSAnimationContext.runAnimationGroup({ context in
        context.allowsImplicitAnimation = true
        self.window?.layoutIfNeeded()
    })
}

调整大小动画按预期工作。

我的问题:如果我触发了调整大小动画,并且包含聚焦的 UI 元素的子视图被动画到一个新位置,它的焦点环立即跳转从它的开始到它的UI 元素本身正确动画时的最终位置。

知道我做错了什么吗?

【问题讨论】:

  • 谢谢。但我见过其他应用程序(例如 Mac 的 OmniFocus)似乎可以在对焦环中完成动画。我想知道他们是怎么做到的。
  • 你的意思是NSStackView的superview?是的。
  • 好吧,我帮不上忙;我只能告诉你的是,我在使用你描述的技术的 NSStackView 动画上遇到了很多问题,以至于在一个应用程序中我完全放弃了 NSStackView。

标签: cocoa autolayout core-animation


【解决方案1】:

我认为这与同一视频中讨论的问题有关(跳跃窗口调整大小)。视频中还讨论的解决方案是

  1. 通过constraint.animator.constant 访问器或显式动画约束常量(而不是添加/删除约束)或
  2. 首先分别为相关约束设置动画,然后是窗口框架,同时保持约束优先级低于窗口调整大小优先级,以便为约束设置动画不会调整窗口大小。

如果约束更改可以通过简单的常量更改来描述,我发现方法 1 更简单。

【讨论】:

  • 谢谢,我会看看这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2014-04-29
  • 2014-05-22
  • 1970-01-01
相关资源
最近更新 更多