3

NSImageView を 0.1 秒のアニメーション ブロックで元のサイズの 120% にスケーリング/サイズ変更し、アニメーション ブロックが完了したら元のサイズに戻そうとしています。これを行うための最も迅速でCPUの負荷が最も少ない方法は何ですか?

基本的に、iOS で使用されている次のコードに相当するコードを探していますが、Mac アプリには必要です。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 0.1];
image.transform = CGAffineTransformScale(image.transform, newSize, newSize);
[UIView setAnimationDelegate:self];
[UIView commitAnimations];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 0.1];
image.transform = CGAffineTransformScale(image.transform,  originalSize, originalSize);
[UIView setAnimationDelegate:self];
[UIView commitAnimations];

助けてくれてありがとう。

4

1 に答える 1

3

イメージが 内でスケーリングされているかどうかによっては、CPU を少し消費する可能性がありますが、次のようにNSImageView使用して同じことを達成できます。NSAnimationContext

NSRect oldFrame = self.imageView.frame;
NSRect newFrame = NSMakeRect(self.imageView.frame.origin.x,
                             self.imageView.frame.origin.y,
                             self.imageView.frame.size.width*1.2f,
                             self.imageView.frame.size.height*1.2f);

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
    // Animating to the new frame...
    [context setDuration:0.1f];
    [[self.imageView animator] setFrame:newFrame];
} completionHandler:^{
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
        // Back to the old frame...
        [context setDuration:0.1f];
        [[self.imageView animator] setFrame:oldFrame];
    } completionHandler:nil];
}];

しかし、その方法は OS X 10.7 以降で動作します。

これは、コードに少し似た方法で行うこともでき、UIView10.5 以降で動作します。

- (void)whatever {
    NSRect oldFrame = self.imageView.frame;
    NSRect newFrame = NSMakeRect(self.imageView.frame.origin.x,
                                 self.imageView.frame.origin.y,
                                 self.imageView.frame.size.width*1.2f,
                                 self.imageView.frame.size.height*1.2f);

    [self performSelector:@selector(animateImageViewToFrame:)
               withObject:[NSValue valueWithRect:newFrame]
               afterDelay:0];
    [self performSelector:@selector(animateImageViewToFrame:)
               withObject:[NSValue valueWithRect:oldFrame]
               afterDelay:0.1f];
}



- (void)animateImageViewToFrame:(NSValue*)frameValue {
    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:0.1f];
    // Get smaller
    [[self.imageView animator] setFrame:[frameValue rectValue]];
    [NSAnimationContext endGrouping];
}

もちろん、これがうまくいけば素晴らしいでしょう:

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.1f];
[[self.imageView animator] setFrame:newFrame];
[NSAnimationContext endGrouping];

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.1f];
[[self.imageView animator] setFrame:oldFrame];
[NSAnimationContext endGrouping];

またはさらに良い:

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.1f];
[[self.imageView animator] setFrame:newFrame];
[[self.imageView animator] setFrame:oldFrame];
[NSAnimationContext endGrouping];

しかし、私には理解できない理由で、どちらも何もしません。

詳細については、NSAnimationContext クラス リファレンスを参照してください。

于 2013-04-20T05:00:57.200 に答える