파인더 및 노트에는 재현하려는 고유 한 동작이 있습니다. NSToolbar의 '유연한 공간'은 분할보기의 크기를 고려한 것 같습니다. 예를 들어, 첫 번째 단추 그룹은 왼쪽에 세로 막대의 오른쪽에 정렬됩니다. 두 번째 아이콘 그룹은 첫 번째 열의 오른쪽에 정렬됩니다. 사이드 바를 넓힐 때 도구 모음 항목이 함께 이동합니다.NSSplitView 열로 NSToolbarItem을 정렬하십시오.
이것을 재현 할 수 있습니까?
final class MainWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
window?.toolbar?.delegate = self
// Make sure that tracking is enabled when the toolbar is completed
DispatchQueue.main.async {
self.trackSplitViewForFirstFlexibleToolbarItem()
}
}
}
extension MainWindowController: NSToolbarDelegate {
func toolbarWillAddItem(_ notification: Notification) {
// Make sure that tracking is evaluated only after the item was added
DispatchQueue.main.async {
self.trackSplitViewForFirstFlexibleToolbarItem()
}
}
func toolbarDidRemoveItem(_ notification: Notification) {
trackSplitViewForFirstFlexibleToolbarItem()
}
/// - Warning: This is a private Apple method and may break in the future.
func toolbarDidReorderItem(_ notification: Notification) {
trackSplitViewForFirstFlexibleToolbarItem()
}
/// - Warning: This method uses private Apple methods that may break in the future.
fileprivate func trackSplitViewForFirstFlexibleToolbarItem() {
guard var toolbarItems = self.window?.toolbar?.items, let splitView = (contentViewController as? NSSplitViewController)?.splitView else {
return
}
// Add tracking to the first flexible space and remove it from the group
if let firstFlexibleToolbarItem = toolbarItems.first, firstFlexibleToolbarItem.itemIdentifier == NSToolbarFlexibleSpaceItemIdentifier {
_ = firstFlexibleToolbarItem.perform(Selector(("setTrackedSplitView:")), with: splitView)
toolbarItems.removeFirst()
}
// Remove tracking from other flexible spaces
for flexibleToolbarItem in toolbarItems.filter({ $0.itemIdentifier == NSToolbarFlexibleSpaceItemIdentifier }) {
_ = flexibleToolbarItem.perform(Selector(("setTrackedSplitView:")), with: nil)
}
}
}
환상적입니다. 두 가지 설명 : (1)'toolbarWillAddItem :'은이 메소드가 호출 될 때 툴바 아이템이 업데이트되지 않기 때문에 약간 다른 동작이 필요합니다. 대신'setTrackedSplitView :'이이 네트 아이템에 직접 호출되어야한다. (2) 나머지 항목을 nil로 설정하면 비정상적인 동작이 발생하고 '인식 할 수없는 선택자'종류의 오류가 발생합니다. – Eitot
나머지 ** flexible space ** 항목은'nil'을 추적하도록 설정해야합니다. 후드 아래에는 해당 항목에 대한 특정 하위 클래스가 있다고 가정합니다. 이전에 추적 뷰를 설정 한 다음 순서를 변경했기 때문에 추적 된 분할 뷰를 지울 필요가 있습니다. '-toolbarWillAddItem :'과 관련하여, 필자의 코드는 메인 쓰레드에'dispatch_async()'를 사용하여 실행 루프 사이클의 끝까지 아이템의 업데이트를 연기한다. –
'DispatchQueue.main.async()'에서 호출하는 것은 응용 프로그램이 실행 중일 때만 내 코드에서 작동하지만 시작시에는 작동하지 않는 것 같습니다. 이것을 구현 한 예를 들어 주시겠습니까? – Eitot