既存のプロジェクトでRBSplitView
置き換えたい。アプリケーションは現在 leopard のみであり、Leopard に同梱されている新しいNSSplitView
ものに置き換えたいと考えています。RBSplitView
NSSplitView
ただし、RBSplitView
の便利なメソッドexpand
とcollapse
inがありませんNSSplitView
。プログラムで NSSplitView の一部を展開および折りたたむにはどうすればよいですか?
既存のプロジェクトでRBSplitView
置き換えたい。アプリケーションは現在 leopard のみであり、Leopard に同梱されている新しいNSSplitView
ものに置き換えたいと考えています。RBSplitView
NSSplitView
ただし、RBSplitView
の便利なメソッドexpand
とcollapse
inがありませんNSSplitView
。プログラムで NSSplitView の一部を展開および折りたたむにはどうすればよいですか?
折りたたむサブビューを非表示にするだけです。
[aSubViewToCollapse setHidden:YES];
デリゲート メソッド -(BOOL)splitView:shouldHideDividerAtIndex: を実装して YES を返し、折りたたまれたときに仕切りを非表示にすることもできます。
プログラムによる展開と折りたたみが機能NSSplitView
するようになりました。また、仕切りがダブルクリックされるたびにサブビューを展開/折りたたむように構成NSSplitView
したので、これをその機能でうまく機能させたいと思っていました(そしてそうです)。これは私がしたことです:
(この例でsplitView
は、NSSplitView
それ自体でsplitViewSubViewLeft
あり、展開/折りたたみたいサブビューでありlastSplitViewSubViewLeftWidth
、 type のインスタンス変数ですCGFloat
。)
// subscribe to splitView's notification of subviews resizing
// (I do this in -(void)awakeFromNib)
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(mainSplitViewWillResizeSubviewsHandler:)
name:NSSplitViewWillResizeSubviewsNotification
object:splitView
];
// this is the handler the above snippet refers to
- (void) mainSplitViewWillResizeSubviewsHandler:(id)object
{
lastSplitViewSubViewLeftWidth = [splitViewSubViewLeft frame].size.width;
}
// wire this to the UI control you wish to use to toggle the
// expanded/collapsed state of splitViewSubViewLeft
- (IBAction) toggleLeftSubView:(id)sender
{
[splitView adjustSubviews];
if ([splitView isSubviewCollapsed:splitViewSubViewLeft])
[splitView
setPosition:lastSplitViewSubViewLeftWidth
ofDividerAtIndex:0
];
else
[splitView
setPosition:[splitView minPossiblePositionOfDividerAtIndex:0]
ofDividerAtIndex:0
];
}
上記の解決策を試しましたが、isSubviewCollapsedがYESを返さなかったため、機能しないことがわかりました。
提案の組み合わせは、うまくいく結果をもたらしました
if ([splitViewTop isHidden]) {
[splitViewTop setHidden:NO];
[split
setPosition:previousSplitViewHeight
ofDividerAtIndex:0];
}
else {
[splitViewTop setHidden:YES];
}
[split adjustSubviews];
El Capitan では、これでうまくいきました。
splitViewItem.collapsed = YES;
提案をいくつか試した後、これが私が見つけた最も簡単な解決策でした:
-(void)toggleCollapsibleView:(ib)sender {
[collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
[splitView adjustSubviews];
}
この関数は、ユーザー定義のファーストレスポンダ アクションです。メニュー項目 (またはキーストローク) によってトリガーされます。collapsibleView は splitView のサブビューであり、両方とも IB でそのプロパティに接続されています。
macOS Sierra では、collapsed
プロパティが に変更されましたisCollapsed
。true
プロパティをorに設定するだけで簡単ですfalse
。次のコードは、WindowController
2 つSplitViewItem
の がある my からのものです。
@IBAction func toggleMap(_ sender: Any) {
if let splitViewController = contentViewController as? NSSplitViewController {
let splitViewItem = splitViewController.splitViewItems
if splitViewItem.first!.isCollapsed {
splitViewItem.first!.isCollapsed = false
} else if splitViewItem.last!.isCollapsed {
splitViewItem.last!.isCollapsed = false
} else {
if splitViewItem.first!.isCollapsed {
splitViewItem.first!.isCollapsed = false
}
splitViewItem.last!.isCollapsed = true
}
}
}
迅速にこれは機能します
func togglePanel() {
let splitViewItem = self.mySplitView.arrangedSubviews
if mySplitView.isSubviewCollapsed(outline.view){
splitViewItem[0].hidden = false
} else {
splitViewItem[0].hidden = true
}
これを IBAction から呼び出します。outline は独自の xib を持つ OutlineViewController であり、ビューが必要なため Outline.view が必要です。シンプルに保ちますが、理解していただければ幸いです。
@IBAction func segmentAction(sender: NSSegmentedControl) {
splitVC?.togglePanel(sender.selectedSegment)
}
と
func togglePanel(segmentID: Int) {
let splitViewItem = self.mySplitView.arrangedSubviews
switch segmentID {
case segmentID:
if mySplitView.isSubviewCollapsed(splitViewItem[segmentID]) {
splitViewItem[segmentID].hidden = false
} else {
splitViewItem[segmentID].hidden = true
}
default:
break
}
}
そしてデリゲートを実装する
func splitView(splitView: NSSplitView, shouldHideDividerAtIndex dividerIndex: Int) -> Bool {
return true
}
10.11では、toggleSidebar アクション メソッドを使用するだけです。 NSSplitView サブビューの表示を切り替える方法 + ペイン スプリッタ ディバイダを非表示にする方法は? https://github.com/Dis3buted/SplitViewController
Brandon Walkin のBWToolKitを試すことができます。
BWSplitView クラスにはメソッドがあります
- (IBAction)toggleCollapse:(id)sender;