以编程方式切换NSSplitViewItems

时间:2015-06-30 14:30:09

标签: objective-c macos nssplitview nssplitviewcontroller

我正在尝试找到一种以编程方式调整NSSplitViewItems的方法。

假设NSWindow帧大小为500x500px。 masterViewItem的宽度为100px,而subViewItem的宽度为400px。

FOO时,我希望masterViewItem折叠到0px(向左), 而subViewItem扩展以填充整个窗口(500px)。

BAR时,我希望masterViewItem扩展回100px,而subViewItem折叠回原来的400px。

- (IBAction) onTapOnSomeButton:(NSButton *)sender {

    NSWindow *window = [[NSApplication sharedApplication] mainWindow];
    NSSplitViewController *splitViewController = (NSSplitViewController *)[window contentViewController];
    NSSplitViewItem *masterViewItem =[splitViewController.splitViewItems firstObject];
    NSSplitViewItem *subViewItem = [splitViewController.splitViewItems lastObject];
    if (FOO) {
        [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
            //    Expand subViewItem 
        } completionHandler:^{
        }];
    } else if (BAR) {
        [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
            //    Expand masterViewItem while shrinking subViewItem
        } completionHandler:^{
        }];
    }
}

我能够为每个项目设置动画,使其看起来像是折叠/展开, 即。

subViewItem.viewController.view.animator.frame = CGRectMake(0, 0, window.frame.size.width, subViewItem.viewController.view.frame.size.height);

但是分隔符不会移动,使两个项目单独移动,并且看起来整个屏幕都不会崩溃/扩展。

我该如何实现?提前谢谢。

更新

所以我做了一些研究,发现了这个:

How to animate the NSSplitView while resizing?

所以我做了这样的代码:

- (IBAction) onTapOnSomeButton:(NSButton *)sender {
    NSWindow *window = [[NSApplication sharedApplication] mainWindow];
    NSSplitViewController *splitViewController = (NSSplitViewController *)[window contentViewController];
    NSSplitViewItem *masterViewItem =[splitViewController.splitViewItems firstObject];
    NSSplitViewItem *subViewItem = [splitViewController.splitViewItems lastObject];
    if (FOO) {
         NSMutableDictionary *collapseMainAnimationDict = [NSMutableDictionary dictionaryWithCapacity:2];
         [collapseMainAnimationDict setObject: subView forKey:NSViewAnimationTargetKey];
         NSRect newRightSubViewFrame = subView.frame;
         newRightSubViewFrame.size.width =  splitViewController.splitView.frame.size.width;
         [collapseMainAnimationDict setObject:[NSValue valueWithRect:newRightSubViewFrame] forKey:NSViewAnimationEndFrameKey];

         NSMutableDictionary *collapseInspectorAnimationDict = [NSMutableDictionary dictionaryWithCapacity:2];
         [collapseInspectorAnimationDict setObject: masterView forKey:NSViewAnimationTargetKey];
         NSRect newLeftSubViewFrame = masterView.frame;
         newLeftSubViewFrame.size.width = 0.0f;
         newLeftSubViewFrame.origin.x = splitViewController.splitView.frame.size.width;
         [collapseInspectorAnimationDict setObject:[NSValue valueWithRect:newLeftSubViewFrame] forKey:NSViewAnimationEndFrameKey];

         NSViewAnimation *collapseAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects: collapseMainAnimationDict, collapseInspectorAnimationDict, nil]];
         [collapseAnimation setDuration:0.3f];
         [collapseAnimation startAnimation];
         [splitViewController.splitView adjustSubviews];
         [splitViewController.splitView setNeedsDisplay: YES];
    } else if (BAR) {
        // Not yet implemented
    }
}

但没有效果。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您必须使用[NSSplitView setPosition:ofDividerAtIndex:]调整窗格大小。

我不知道NSSplitViewController是什么,但可能您可以通过其NSSplitView媒体或其他类似地访问view

答案 1 :(得分:0)

而不是将其视为调整大小,听起来您只是试图折叠/取消主视图项目。您可以使用NSSplitViewItem的{​​{1}}属性及其collapsed代理来触发崩溃:

animator

并解开:

    if (FOO) {
        //    Expand subViewItem (collapse the master view item)
        masterViewItem.animator.collapsed = YES;

使用10.11,可以使用API​​将主视图项指定为“侧边栏”,该项目具有该项目的其他折叠/解折叠行为(例如叠加层)。