NSSplitView の一部をプログラムで展開したり折りたたんだりするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/925020

  •  06-09-2019
  •  | 
  •  

質問

交換したいです RBSplitViewNSSplitView 私の既存のプロジェクトで。アプリケーションは現在 Leopard のみになっているため、置き換えたいと考えています RBSplitView とともに 新しい NSSplitView Leopard に同梱されています。

しかし、私は行方不明です RBSplitViewの便利なメソッド expand そして collapseNSSplitView. 。NSSplitView の一部をプログラムで展開したり折りたたんだりするにはどうすればよいですか?

役に立ちましたか?

解決

私は、プログラムエキスパンドを持って仕事にNSSplitViewの崩壊します。 (そしてそれが思わ)私も自分のNSSplitView分圧器をダブルクリックするたびサブビューを展開/縮小するために構成したので、私は、これはその機能を持つ素晴らしいプレーしたかったです。これは私がやったことです。

(この例では、splitViewNSSplitView自体は、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 WindowControllersを持っている私の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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top