Программно переключить изменение размера NSSplitViewItems

Я пытаюсь найти способ программно изменить размер NSSplitViewItems,

Скажи NSWindow размер кадра 500x500px.masterViewItem имеет ширину 100 пикселей, в то время как subViewItem имеет ширину 400 пикселей.

когда FOO, Я хочу masterViewItem свернуть до 0px (влево), в то время как subViewItem расширяется, чтобы заполнить все окно (500 пикселей)

когда 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
    }
}

Но безрезультатно. Какие-либо предложения?

2 ответа

Вы должны изменить размеры панелей, используя [NSSplitView setPosition:ofDividerAtIndex:],

Я понятия не имею что NSSplitViewController есть, но, вероятно, вы можете получить доступ к NSSplitView через его view собственность или что-то подобное.

Вместо того, чтобы рассматривать его как изменение размера, похоже, что вы просто пытаетесь свернуть / развернуть элемент основного вида. Вы можете просто использовать NSSplitViewItem"s 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 для обозначения вашего основного элемента представления в качестве "боковой панели", которая имеет дополнительное поведение свертывания / разворачивания для этого элемента (например, наложения).

Другие вопросы по тегам