1

我正在尝试找到一种以编程方式调整大小的方法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);

但是分隔线不会移动,使两个项目只是单独移动,并且看起来整个屏幕都不会折叠/展开。

我将如何实现这一点?提前致谢。

更新

所以我做了更多的研究,发现了这个:

如何在调整大小时为 NSSplitView 设置动画?

所以我做了这样的代码:

- (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
    }
}

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

4

2 回答 2

1

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

我不知道是什么NSSplitViewController,但大概你可以NSSplitView通过它的view属性或类似的方式访问它。

于 2015-06-30T14:36:44.243 回答
1

与其将其视为调整大小,不如说您只是在尝试折叠/展开主视图项。您可以使用NSSplitViewItem'collapsed属性及其animator代理来触发折叠:

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

并展开:

    } else if (BAR) {
        //    Expand masterViewItem while shrinking subViewItem
        masterViewItem.animator.collapsed = NO;
    }
}

在 10.11 中,有 API 可将您的主视图项指定为“侧边栏”,该项具有额外的折叠/取消折叠行为(例如覆盖)。

于 2015-07-01T05:49:09.790 回答