Не грязный вид перерисовывается - PullRequest
2 голосов
/ 28 сентября 2011

У меня странная проблема. Я запрограммировал док-панель.

Это в основном NSView с тремя вертикальными подпредставлениями внутри. Итак, у меня есть левый док, средний вид и правый док. Обе доки разборные. Уменьшается средний вид при свертывании.

Я использую CoreAnimation, чтобы оживить процесс свертывания. Это работает почти правильно. Если я открою левую док-станцию, будет вызван метод правой доки drawRect, хотя он не грязный.

Если я деактивирую animator и устанавливаю новый размер кадра напрямую, правая док-станция не перерисовывается при разворачивании, поэтому я предполагаю, что расчет кадров правильный.

Вот мой код для свертывания доков:

- (void) mouseDown:(NSEvent *)event 
{
  // Exit method if already animating a dock
  if(is_animating)
  {
    return;
  }

  NSPoint firstPoint    = [self convertPoint:[event locationInWindow] fromView:nil];
  unsigned long divider = [self mousePointInCollapseRect:firstPoint];

  // If not clicked on a divider don't animate anything
  if(divider == NSNotFound)
  {
    return;
  }

  NSView* main_view     = [[self subviews] objectAtIndex:VIEW_MIDDLE];
  NSView* collapse_view = [[self subviews] objectAtIndex:(divider == 0)? VIEW_LEFT : VIEW_RIGHT];

  NSRect cframe = [collapse_view frame];  // New collapsable frame
  NSRect mframe = [main_view frame];      // New main frame

  if([self isSubviewCollapsed:collapse_view] == NO)
  {
    if(divider == 0)
    {            
      cframe.size.width  = 0.0;
      mframe.origin.x   -= (dock_width_left + DIVIDER_THICKNESS);
      mframe.size.width += (dock_width_left + DIVIDER_THICKNESS);
    }
    else
    {      
      mframe.size.width += (collapse_view.frame.size.width + DIVIDER_THICKNESS);
      cframe.size.width  = 0.0;
      cframe.origin.x    = mframe.origin.x + mframe.size.width;
    }

    // Turn off autoresizesSubviews on the collapsible subview
    [collapse_view setAutoresizesSubviews:NO];

    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:(ANIMATION_DURATION)]; 

    [[collapse_view animator] setFrame:cframe];
    [[main_view animator]     setFrame:mframe];

    [NSAnimationContext endGrouping];
  }
  else
  {
    // Uncollapse dock    
    if(divider == 0)
    {
      // Left dock
      cframe.size.width  = dock_width_left;
      mframe.origin.x    = (COLLAPSEBAR_THICKNESS + dock_width_left + DIVIDER_THICKNESS);
      mframe.size.width -= (dock_width_left + DIVIDER_THICKNESS);
    }
    else
    {   
      // Right dock
      mframe.size.width -= (dock_width_right + DIVIDER_THICKNESS);
      cframe.size.width  = dock_width_right;
      cframe.origin.x    = mframe.origin.x + mframe.size.width + DIVIDER_THICKNESS;
    }

    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:ANIMATION_DURATION];   

    [[main_view animator]     setFrame:mframe];
    [[collapse_view animator] setFrame:cframe];

    [NSAnimationContext endGrouping];

    //Restore Autoresizing on subview
    [self performSelector:@selector(restoreAutoResizingOfSubview:) withObject:collapse_view afterDelay:ANIMATION_DURATION + 0.05];
  }

  is_animating = YES;
  [self performSelector:@selector(animationEnded) withObject:nil afterDelay:ANIMATION_DURATION + 0.05];
}

Так почему же перерисовывается не грязный вид?

...