我正在尝试使(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 上有一个小测试项目。
更新提到的项目现在已经用解决方案进行了更新。
谢谢,泰奥