2013-06-01 3 views
0

NSScrollView와 NSTableView에 NSTableColumn이 포함되어 있습니다. 버튼을 누르면 애니메이션이있는 NSScrollView'width가 변경됩니다. 이 잘 작동애니메이션을 사용하여 NSTableColumn 너비를 변경하는 방법

NSDictionary *myScrollViewDictionary = [[NSDictionary alloc] initWithObjectsAndKeys: 
               myScrollView,NSViewAnimationTargetKey, 
               [NSValue valueWithRect:myScrollViewStartFrame],NSViewAnimationStartFrameKey, 
               [NSValue valueWithRect:myScrollViewEndFrame],NSViewAnimationEndFrameKey, nil]; 

    NSViewAnimation *animation = [[NSViewAnimation alloc] initWithViewAnimations:@[myScrollViewDictionary]]; 
    animation.delegate = self; 
    animation.duration = 0.2; 
    [animation setAnimationBlockingMode:NSAnimationBlocking]; 
    [animation startAnimation]; 

: 다음은 내 코드입니다.

하지만 같은 애니메이션과의 사이에 각 Column'width을 변경하려면, 문제는 NSTableColumn는 NSView의 아니다, 그래서 나는 단지 어떤 애니메이션없이 Column'width을 변경할 수는 frame.Now을 변경할 수 없습니다.

누군가 아이디어가 있습니까?

답변

1

모든 것을 수동으로 처리하는 나만의 맞춤 애니메이션을 만들어야 할 것 같습니다. 열을 애니메이션으로 만들려면 다음과 같이하십시오.

- (IBAction)animateColumn:(id)sender 
{ 
    NSTableColumn *tableColumn; // = set your table column 
    CGFloat initialWidth = [tableColumn width]; 
    CGFloat finalWidth; // = whatever 

    dispatch_async(dispatch_get_global_queue(0,0), { 
    double animationTime = 2; //seconds 
    double timeElapsed = 0; //approximate measure; probably good enough 

    while (timeElapsed<animationTime) 
    { 
     double t = timeElapsed/animationTime; 

     CGFloat width = t*finalWidth + (1-t)*initialWidth; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [tableColumn setWidth:width]; 
     }); 

     NSDate *future = [NSDate dateWithTimeIntervalSinceNow:0.02]; 
     [NSThread sleepUntilDate:future]; 
     timeElapsed += 0.02; 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [tableColumn setWidth:finalWidth]; 
    }); 
    }); 
} 

나는 이것을 원하는대로 조정할 수 있습니다. 아마도 당신은 다른 애니메이션을 시작하는 동시에이 애니메이션을 시작할 수 있습니다 (예를 들어 2에서 0.2로 변경).