19

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

ただし、RBSplitViewの便利なメソッドexpandcollapseinがありませんNSSplitView。プログラムで NSSplitView の一部を展開および折りたたむにはどうすればよいですか?

4

10 に答える 10

31

折りたたむサブビューを非表示にするだけです。

[aSubViewToCollapse setHidden:YES];

デリゲート メソッド -(BOOL)splitView:shouldHideDividerAtIndex: を実装して YES を返し、折りたたまれたときに仕切りを非表示にすることもできます。

于 2010-04-28T09:29:37.243 に答える
10

プログラムによる展開と折りたたみが機能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
         ];
}
于 2009-07-09T11:13:00.190 に答える
7

上記の解決策を試しましたが、isSubviewCollapsedがYESを返さなかったため、機能しないことがわかりました。

提案の組み合わせは、うまくいく結果をもたらしました

if ([splitViewTop isHidden]) {
    [splitViewTop setHidden:NO];
    [split
     setPosition:previousSplitViewHeight
     ofDividerAtIndex:0];
}
else {
    [splitViewTop setHidden:YES];
}
[split adjustSubviews];
于 2011-07-11T05:18:20.420 に答える
6

El Capitan では、これでうまくいきました。

splitViewItem.collapsed = YES;
于 2015-12-11T16:25:20.873 に答える
3

提案をいくつか試した後、これが私が見つけた最も簡単な解決策でした:

-(void)toggleCollapsibleView:(ib)sender {
   [collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
   [splitView adjustSubviews];
}

この関数は、ユーザー定義のファーストレスポンダ アクションです。メニュー項目 (またはキーストローク) によってトリガーされます。collapsibleView は splitView のサブビューであり、両方とも IB でそのプロパティに接続されています。

于 2014-01-04T11:43:25.600 に答える
3

macOS Sierra では、collapsedプロパティが に変更されましたisCollapsedtrueプロパティをorに設定するだけで簡単ですfalse。次のコードは、WindowController2 つ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
        }
    }
}
于 2017-02-06T19:28:56.693 に答える
2

迅速にこれは機能します

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

于 2016-05-11T11:00:03.117 に答える
0

Brandon Walkin のBWToolKitを試すことができます。

BWSplitView クラスにはメソッドがあります

- (IBAction)toggleCollapse:(id)sender;
于 2009-05-29T10:17:30.980 に答える