gpt4 book ai didi

multithreading - NSSplitViewItem 折叠动画和窗口 setFrame 冲突

转载 作者:搜寻专家 更新时间:2023-10-30 21:50:54 25 4
gpt4 key购买 nike

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

问题是我在动画中出现抽搐(如 here 所示)。

我进行折叠的代码是这样的:

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)
}
}

我知道“不要跨流”问题(来自 WWDC'13 session 213),其中在主线程上运行的窗口大小调整动画和在单独线程上运行的核心动画折叠动画会干扰每个其他。将 splitViewItem 折叠动画放到主线程上似乎是错误的方法,我有一种挥之不去的感觉,我缺少一种更好的方法。

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

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

更新 提到的项目现已更新为解决方案。

谢谢,特奥

最佳答案

该问题类似于“不要交叉流”问题,因为您创建的动画有两个驱动程序:(1) Split View项 (2) 窗口,它们不是同步。

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

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

Animating Window frame

相反, Split View项动画可以完全驱动动画并使用 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
}

Animating SplitViewItem

关于multithreading - NSSplitViewItem 折叠动画和窗口 setFrame 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com