2012-08-13 63 views
0

我想要实现的是,当用户按下按钮窗口增长和额外的空间是由一个NSSplitview小组采取的,它没有收缩和增长以填补空间。动画NSSplitview和窗口大小

我可以很容易地调整窗口大小和splitview独立增长的动画,但是当我尝试将两个动画放在一起时,不可避免地会发生在另一个或多个步骤之前。首先窗口部分调整大小,然后再调整splitview大小,然后调整窗口大小,最后splitview结束。任何可能会发生的原因?

这里是我使用的代码:

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

回答

0

如果你正在寻找的NSSplitView类参考一点点接近,你会认识到它符合NSAnimatablePropertyContainer。这意味着NSSplitView将为您提供“自身的动画代理”。如果你在NSSplitView上拨打animator,你会得到这个代理,你应该能够以动画的方式改变属性。

要调整动画持续时间和计时功能,请使用NSAnimationContext,就像您已经做过的一样。

最后但并非最不重要:您是否认识到NSSplitView'sminPossiblePositionOfDividerAtIndex:maxPossiblePositionOfDividerAtIndex: