NSSplitView の一部をプログラムで展開したり折りたたんだりするにはどうすればよいですか?
-
06-09-2019 - |
質問
交換したいです RBSplitView
と NSSplitView
私の既存のプロジェクトで。アプリケーションは現在 Leopard のみになっているため、置き換えたいと考えています RBSplitView
とともに 新しい NSSplitView
Leopard に同梱されています。
しかし、私は行方不明です RBSplitView
の便利なメソッド expand
そして collapse
で NSSplitView
. 。NSSplitView の一部をプログラムで展開したり折りたたんだりするにはどうすればよいですか?
解決
私は、プログラムエキスパンドを持って仕事にNSSplitView
の崩壊します。 (そしてそれが思わ)私も自分のNSSplitView
分圧器をダブルクリックするたびサブビューを展開/縮小するために構成したので、私は、これはその機能を持つ素晴らしいプレーしたかったです。これは私がやったことです。
(この例では、splitView
はNSSplitView
自体は、splitViewSubViewLeft
のI /崩壊とlastSplitViewSubViewLeftWidth
を展開したいサブビューは、型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
];
}
他のヒント
は単純に例えば、あなたが崩壊したいサブビューを非表示にします。
[aSubViewToCollapse setHidden:YES];
また、デリゲートメソッドを実装する場合があります - (BOOL)splitView:shouldHideDividerAtIndex:とき崩壊
仕切りを隠すためにYESを返します。私は、上記の溶液を試みたが、isSubviewCollapsedはYESを返したことがないとして、それは動作しませんでした。
の提案の組み合わせは
動作結果が得られましたif ([splitViewTop isHidden]) {
[splitViewTop setHidden:NO];
[split
setPosition:previousSplitViewHeight
ofDividerAtIndex:0];
}
else {
[splitViewTop setHidden:YES];
}
[split adjustSubviews];
いくつかの提案を試した後、これは私が見つけた最も簡単な解決策でした
-(void)toggleCollapsibleView:(ib)sender {
[collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
[splitView adjustSubviews];
}
関数は、第一応答者アクションユーザー定義です。これは、メニュー項目(またはキーストローク)によってトリガーされます。 collapsibleViewは、それらの特性を有するIBに接続されている両方ともsplitViewでサブビューである。
エルキャピタンでは、これは私のためのトリックをやっています。
splitViewItem.collapsed = YES;
NSSplitView
実際に持っています プライベートメソッド -(void)_setSubview:(NSView *)view isCollapsed:(BOOL)collapsed
それはこれを行います。プライベート メソッドの使用に対する警告をすべて無視したい場合は、以下を参照してください。
- (void)toggleSubview:(NSView *)view {
SEL selector = @selector(_setSubview:isCollapsed:);
NSMethodSignature *signature = [NSSplitView instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.target = self;
invocation.selector = selector;
[invocation setArgument:&view atIndex:2];
BOOL arg = ![self isSubviewCollapsed:view];
[invocation setArgument:&arg atIndex:3];
[invocation invoke];
}
これをカテゴリとして実装しました NSSplitView
. 。唯一の問題は、Xcode が次の警告を発することです。 _setSubview:isCollapsed:
未申告です…それを回避する方法がよくわかりません。
エルキャピタンのアップデート
私はここ 2 年ほど OS X 用のコードを書いていないので、これを検証できませんでしたが、 レモンモジョ 以下のコメントで、 _setSubview:isCollapsed:
El Capitan ではに名前が変更されました _setArrangedView:isCollapsed:
.
MacOSのシエラでは、collapsed
プロパティがisCollapsed
に変更されます。ただtrue
またはfalse
にプロパティを設定する簡単です。次のコードは、私が2 WindowController
sを持っている私のSplitViewItem
、からである。
@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からこれを呼び出します アウトラインが自分の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アクションメソッドを使用する場合があります。 サブビュー+ペインスプリッタデバイダを非表示にするには?に https://github.com/Dis3buted/SplitViewControllerする
私の代わりにNSSplitViewController
を使用することをお勧めします、とNSSplitViewItem.isCollapsed
は、それらを制御します。これだけでは動作します。
let item: NSSplitViewItem = ...
item.isCollapsed = true
これが正しく動作するようにするには、あなたは主にビュー・コントローラとのスプリットUIコンポーネントを設定する必要があります。それ以外の場合は、分けることができます。
あなたはブランドンウォーキンの BWToolKit してみてください可能性があります。
BWSplitViewクラスがメソッドを持っている
- (IBAction)toggleCollapse:(id)sender;