mail.app のような自動レイアウト制約により、3 つのサブビューで分割ビューを構成することは可能ですか? つまり、ユーザーがウィンドウのサイズを変更すると、右端のサブビューのみがサイズを変更し、ユーザーが左端と中央のサブビューの間の仕切りをドラッグすると、左右のサブビューのみがサイズを変更し、ユーザーが中央と中央の間の仕切りをドラッグすると、これらのサブビューのみがサイズを変更します。できればやり方。このタスクは制約の優先順位によって実行される可能性があると思いますが、それと混同しました。ありがとう!
2 に答える
自動レイアウト制約を使用せずに解決策を見つけました。私は Rubymotion を使用しているため、私のソリューションは Ruby ですが、Objective-C に簡単に変換できます。
まず、ユーザーが左と中央のサブビューの間の仕切りをドラッグしたときに、左と右のサブビューのみのサイズを変更するために、2 つのネストされた を作成NSSplitView
しました。
質問で言及されている最後のポイントは、つまり、ここでは何もしないwhen the user drags the divider between the middle and the right subviews only these subviews change size
のデフォルトの動作です。NSSplitView
最後に、ユーザーがウィンドウのサイズを変更したときにサイズを変更する右端のサブビューのみを取得するために、splitView:resizeSubviewsWithOldSize:
デリゲート メソッドを実装しました。
def splitView(splitView, resizeSubviewsWithOldSize:oldSize)
sv1 = splitView.subviews[0]
sv2 = splitView.subviews[1]
leftFrame = sv1.frame
rightFrame = sv2.frame
newFrame = splitView.frame
leftFrame.size.height = newFrame.size.height
rightFrame.size.height = newFrame.size.height
leftFrame.origin = NSMakePoint(0,0)
## 1 is the NSSplitView divider width
rightFrame.size.width = newFrame.size.width - leftFrame.size.width - 1
rightFrame.origin.x = leftFrame.size.width + 1
sv1.setFrame(leftFrame)
sv2.setFrame(rightFrame)
end
そしてほら!機能させるのに時間がかかったので、他の人の時間を節約できることを願っています.
自動レイアウトを使用すると、NSSplitView で各仕切りの保持優先度を設定できます。これは、コードでデリゲート メソッドを使用するか、Xcode のインターフェイス ビルダーで行うことができます。