Анимация NSSplitview и размер окна

Я пытаюсь добиться того, чтобы, когда пользователь нажимал кнопку, окно увеличивалось, и панель занимала дополнительное место. NSSplitview это разворачивается и растет, чтобы заполнить пространство.

Я могу легко анимировать изменение размера окна и раздельного просмотра, независимо, но когда я пытаюсь соединить две анимации, одна неизбежно происходит раньше другой или пошагово. Сначала происходит частичное изменение размера окна, затем - изменение размера разделенного вида, затем изменение размера окна заканчивается, и, наконец, также завершается разделенный вид. Любые идеи о том, почему это может происходить?

Вот код, который я использую:

- (IBAction)helpButtonPressed:(id)sender
{
   if ([sender isKindOfClass:[NSMenuItem class]]) [sender setState:![sender state]];
   NSWindow *window = [[[self windowControllers] objectAtIndex:0] window];
   NSRect oldFrame = [window frame];
   CGFloat windowWidthAdd;

   if ([sender state]) windowWidthAdd = HELP_WIDTH; else windowWidthAdd = -HELP_WIDTH;    
   NSRect newFrame = NSMakeRect(oldFrame.origin.x, oldFrame.origin.y,oldFrame.size.width+windowWidthAdd, oldFrame.size.height);

   [[NSAnimationContext currentContext] setDuration:0.3f];
   [NSAnimationContext beginGrouping];
   [[window animator] setFrame:newFrame display:YES];
   if ([sender state]) [self uncollapseRightView]; else [self collapseRightView];
   [NSAnimationContext endGrouping];

}

-(void)collapseRightView
{
    NSView *right = [[self.splitView subviews] objectAtIndex:1];
    NSView *left  = [[self.splitView subviews] objectAtIndex:0];
    NSRect leftFrame = [left frame];
    NSRect overallFrame = [self.splitView frame];
    [right setHidden:YES];
    [[left animator] setFrameSize:NSMakeSize(overallFrame.size.width,leftFrame.size.height)];
}

-(void)uncollapseRightView
{
    NSView *left  = [[self.splitView subviews] objectAtIndex:0];
    NSView *right = [[self.splitView subviews] objectAtIndex:1];
    [right setHidden:NO];
    CGFloat dividerThickness = [self.splitView dividerThickness];
    // get the different frames
    NSRect leftFrame = [left frame];
    // Adjust left frame size
    leftFrame.size.width = (leftFrame.size.width-HELP_WIDTH-dividerThickness);
    NSRect rightFrame = [right frame];
    rightFrame.origin.x = leftFrame.size.width + dividerThickness;
    rightFrame.size.width = HELP_WIDTH;
    [[left animator] setFrameSize:leftFrame.size];
    [[right animator] setFrame:rightFrame];
}

1 ответ

Если вы смотрите немного ближе на ссылку класса NSSplitView, вы узнаете, что это соответствует NSAnimatablePropertyContainer, Это означает NSSplitView предоставит вам "оживляющий прокси-сервер". Если вы позвоните animator на ваше NSSplitView вы получите этот прокси, на котором вы сможете изменять свойства в анимированном виде.

Для настройки длительности анимации и функции синхронизации используйте NSAnimationContext так же, как вы уже сделали.

Последнее, но не менее важное: вы узнали NSSplitView'sminPossiblePositionOfDividerAtIndex: а также maxPossiblePositionOfDividerAtIndex:?

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