嵌套NSSplitView
實例會導致奇怪的行爲。拖動嵌套的splitView的拆分器時,可以移動父級splitView的拆分器以容納較大的子元素作爲拖動的副作用。移動嵌套NSSplitView的分離器使其向外生長
這是一個極簡主義項目的網址,它重現了這個問題。只需將最右邊的分離器拖向右邊,直到最左邊的分離器開始自行移動。 http://filebin.ca/20ymCpNmtts7/NestedSplitTest.zip
據我的理解,問題的原因是,當拖動splitView的拆分器時,會添加一個新約束,將被拖動拆分器左側的contentView的右邊緣綁定到NSSplitView
本身的左邊緣。拖動完成後,此約束將被刪除。當拖動正在進行,並且分離器受到其他面板的最小寬度的限制時,則此臨時約束的常量值的總和超出了窗格可以調整的寬度,並且這會使NSSplitView本身變大,進而調整最外面的分離器。
我已經嘗試使用NSSplitViewDelegate
約束分割位置,但是在NSSplitView已經由於臨時約束而增長之後調用此委託方法。實施constrainMinCoordinate
或constrainMaxCoordinate
委託方法之一會使NSSplitView
完全忽略面板上配置的最小寬度。
此外,我似乎無法通過通知或子類NSSplitView
拖動開始或結束時得到適當的事件。在這兩個事件上掛鉤會讓我添加一個臨時約束,以確保NSSplitView不能向外擴展。即使壓倒性的mouseDown:
和mouseUp:
也不起作用,因爲mouseUp:
在拖動結束後從未被調用過。
更新1: 我已經找到了原因mouseUp:
的解釋是不是叫:這是因爲分離器的拖拽使用在NSEventTrackingRunLoopMode
運行嵌套RunLoop實現。這就是mouseDragged:
和mouseUp:
事件如何被無聲地吞噬。以下是相關文檔:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html#//apple_ref/doc/uid/10000060i-CH6-SW4