Вращение NSImage в NSView не работает
Я пытаюсь повернуть NSImage внутри NSView. Сначала я покажу вам, что я сделал до сих пор.
Изображение:
Заголовочный файл
#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. Теперь очевидно, что я делаю какую-то наивную ошибку, но логически мой код кажется мне правильным. Было бы здорово, если бы кто-то мог указать на мою ошибку и дать мне понять, почему она не работает.
1 ответ
Для любых будущих посетителей, код работает отлично, и вы можете использовать его, если хотите, за исключением того, что перед добавлением слоя в 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];
}
Перед использованием этого кода
Пожалуйста, обратитесь к обсуждению в комментарии. Есть несколько полезных советов, которые я упустил из виду при решении своей проблемы. Кредит идет на - Peter Hosey