(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 に小さなテスト プロジェクトがあります。
更新上記のプロジェクトは、ソリューションで更新されました。
ありがとう、テオ