我想更换 RBSplitViewNSSplitView 在我现有的项目中。该应用程序现在仅适用于 Leopard,我想替换 RBSplitView新的 NSSplitView 与 Leopard 一起发货。

然而我却失踪了 RBSplitView的便捷方法 expandcollapseNSSplitView. 。如何以编程方式展开和折叠 NSSplitView 的部分内容?

有帮助吗?

解决方案

我刚刚程序扩展和NSSplitView塌陷工作。我也配置了我NSSplitView展开/折叠子视图每当分频器是双击,所以我想这对发挥好与该功能(它似乎)。这是我做过什么:

(在这个例子中,splitViewNSSplitView本身,splitViewSubViewLeft是我想展开/折叠和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
         ];
}

其他提示

只要隐藏要折叠子视图,e.g。

[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在SPLITVIEW两者都连接在IB与他们的特性的子视图。

在埃尔卡皮坦,这并获得成功我。

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。是直截了当只需设置属性truefalse。下面的代码是从我WindowController,其中我有两个SplitViewItems。

@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为调用此方法, 大纲是自己的厦门国际银行的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

我建议使用NSSplitViewController代替,和NSSplitViewItem.isCollapsed控制它们。这只是工作。

let item: NSSplitViewItem = ...
item.isCollapsed = true

为了使这个正常工作,你必须与主要视图控制器配置拆分的UI组件。否则,它可以被打破。

您可以尝试布兰登沃尔的 BWToolKit

在BWSplitView类有一个方法

- (IBAction)toggleCollapse:(id)sender;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top