2012-08-13 3 views
0

내가 달성하고자하는 것은 사용자가 버튼을 누르면 창이 커지고 여분의 공간은 공간을 채우는 데 필요한 공간을 채울 수있는 NSSplitview 패널로 가져옵니다.애니메이션 NSSplitview 및 창 크기

윈도우 리사이즈와 스플릿 뷰를 독립적으로 애니메이션 할 수 있지만 두 애니메이션을 함께 넣으려고하면 필연적으로 다른 것 또는 단계별로 발생합니다. 먼저 윈도우의 크기를 부분적으로 조정 한 다음 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:을 알고 계셨습니까?

관련 문제