1

NSView 内で NSImage を回転させようとしています。まず、これまでに行ったことをお見せします。


画像 :


ここに画像の説明を入力


ヘッダーファイル


#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>

@interface AppController : NSObject {
    CALayer *syncFirst;
}

@property (weak) IBOutlet NSView *nsview;

- (IBAction)buttonClicked:(id)sender;
- (CGImageRef) convertToCGImageFromNasImage:(NSImage *) image;

@end

実装ファイル、関連するメソッドのみ


- (void)awakeFromNib {
    
    NSImage *image = [NSImage imageNamed:@"SyncRing.png"];
    //init layer
    syncFirst = [CALayer layer];
    
    //animatated content size init
    syncFirst.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
    syncFirst.position = CGPointMake(10, 10);
    syncFirst.contents = (id)[self convertToCGImageFromNasImage:image];

    [nsview.layer addSublayer:syncFirst];
}

 /*To convert NSImage in CGImage*/

- (CGImageRef) convertToCGImageFromNasImage:(NSImage *) image {
     NSData* cocoaData = [NSBitmapImageRep TIFFRepresentationOfImageRepsInArray: [image representations]];
     CFDataRef carbonData = (__bridge CFDataRef)cocoaData;
     CGImageSourceRef imageSourceRef = CGImageSourceCreateWithData(carbonData, NULL);
     CGImageRef myCGImage = CGImageSourceCreateImageAtIndex(imageSourceRef, 0, NULL);
     return myCGImage;
}

/*When button click animate the image*/

- (IBAction) buttonClicked:(id)sender {
    CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat:(2 * M_PI) * 1];
    rotationAnimation.duration = 1.0f;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [syncFirst addAnimation:rotationAnimation forKey:@"rotateAnimation"];
}

質問 :


基本的に、ボタンをクリックした後にこの画像を回転させようとしています。私が試しているコードは 100% の実装ではありませんが、Apple のドキュメントを含むいくつかの異なる場所から学びました。さて、私が素朴な間違いを犯していることは明らかですが、論理的には私のコードは正しいようです。誰かが私の間違いを指摘し、なぜそれがうまくいかないのかを理解してくれれば幸いです.

4

1 に答える 1

2

将来の訪問者のために、コードは完全に機能し、必要に応じて使用できますが、nsview 内にレイヤーを追加する前に、nsview がレイヤーを必要とするように設定する必要があることを確認してください。

したがって、変更は次のようになります...


- (void)awakeFromNib {

    NSImage *image = [NSImage imageNamed:@"SyncRing.png"];
    //init layer
    syncFirst = [CALayer layer];

    //animatated content size init
    syncFirst.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
    syncFirst.position = CGPointMake(10, 10);
    syncFirst.contents = (id)[self convertToCGImageFromNasImage:image];
    
    /*HERE SETWANTSLAYER TO TRUE IN ORDER TO FIX*/
    [nsview setWantsLayer:YES];

    [nsview.layer addSublayer:syncFirst];
}

このコードを使用する前に

コメントの議論を参照してください。問題を解決する際に見落としていた便利なヒントがいくつかあります。クレジットは -ピーター・ホージー

于 2012-05-31T15:15:38.367 に答える