8

我正在尝试使(10.10 中的新功能)NSSplitViewItem 在移动其包含窗口的同时折叠和展开,以使整个事物保持“原位”。

问题是我在动画中抽搐了(如此处所示

我正在折叠的代码是这样的:

func togglePanel(panelID: Int) {

     if let splitViewItem = self.splitViewItems[panelID] as? NSSplitViewItem {

          // Toggle the collapsed state
          NSAnimationContext.runAnimationGroup({ context in

               // special case for the left panel
               if panelID == 0 {
                    var windowFrame = self.view.window.frame
                    let panelWidth = splitViewItem.viewController.view.frame.width
                    if splitViewItem.collapsed {
                         windowFrame.origin.x -= panelWidth
                         windowFrame.size.width += panelWidth
                    } else {
                         windowFrame.origin.x += panelWidth
                         windowFrame.size.width -= panelWidth
                    }
                    self.view.window.animator().setFrame(windowFrame, display: true)
               }
               splitViewItem.animator().collapsed = !splitViewItem.collapsed
          }, completionHandler: nil)
     }
}

我知道“不要跨越流”问题(来自会话 213,WWDC'13),其中在主线程上运行的窗口大小调整动画和在单独线程上运行的核心动画折叠动画相互干扰。将 splitViewItem 折叠动画放到主线程上似乎是错误的方法,我有一种烦人的感觉,我错过了一种更好的方法来做到这一点。

由于我在任何地方都没有找到任何关于 NSSplitViewItems 的文档(目前),我将不胜感激对此的任何见解。

如果有人想看我在 GitHub 上有一个小测试项目。

更新提到的项目现在已经用解决方案进行了更新。

谢谢,泰奥

4

2 回答 2

15

该问题类似于“不要跨越流”问题,因为您创建的动画有两个驱动程序:(1) 拆分视图项 (2) 窗口,它们不同步。

在 '13 Cocoa Animations 演讲的示例中,设置了约束以产生正确的窗口内动画,因为只有窗口的框架是动画的。

可以在这里尝试类似的东西——只为窗口的框架而不是拆分视图项目设置动画,但由于项目管理用于(取消)折叠的约束,应用程序无法准确控制窗口内内容的动画方式:

动画窗口框架

相反,拆分视图项目动画可以完全驱动动画并使用 NSWindow-anchorAttributeForOrientation:来描述窗口的框架是如何受到影响的。

if let splitViewItem = self.splitViewItems[panelID] as? NSSplitViewItem {
    let window = self.view.window
    if panelID == 0 {
        // The Trailing edge of the window is "anchored", alternatively it could be the Right edge
        window.setAnchorAttribute(.Trailing, forOrientation:.Horizontal)
    }
    splitViewItem.animator().collapsed = !splitViewItem.collapsed
}

动画 SplitViewItem

于 2014-07-07T02:40:54.943 回答
2

对于任何使用 Objective C 并以 10.11 El Capitan 为目标的人。这对我有用,不需要设置 AnchorAttributes。

splitViewItem.collapsed = YES;
于 2015-12-11T16:21:52.667 回答