如何在分层视图的顶部显示动画GIF在Objective C



我正在尝试在mac OSX应用程序的屏幕上绘制动画gif。我用这段代码来插入gif:我可以看到gif是一张没有动画的图片只有静态图片:(我应该添加什么来使它动画化?)

#import <Cocoa/Cocoa.h>
#import <Quartz/Quartz.h>//for drawing circle
#import "sharedPrefferences.h"
@interface GenericFanSubView : NSView
{
    NSColor * _backgroundColor;
    NSImageView* imageView;
}
- (void)setBackgroundColor :(NSColor*)color;
- (void)insertGif1;
- (void)insertGif2;
- (void)insertGif3;
@end
#import "GenericFanSubView.h"
#define PI 3.14285714285714
@implementation GenericFanSubView
- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code here.
            imageView = [[NSImageView alloc]initWithFrame:CGRectMake(0, 0,self.frame.size.width,self.frame.size.height)];
        [imageView setAnimates: YES];
    }
    return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    // Drawing code here.
    [self drawCircleInRect];
    _backgroundColor = [NSColor whiteColor];
    [self insertGif1];
}
-(void)drawCircleInRect
{
    //draw colored circle here
    CGContextRef context = [[NSGraphicsContext // 1
                         currentContext] graphicsPort];
    // ********** Your drawing code here ********** // 2
    CGContextSetFillColorWithColor(context,[self NSColorToCGColor:(_backgroundColor)]);
    float radius1 = self.frame.size.height/2;
    float startAngle = 0;
    float endAngle = endAngle = PI*2;
    CGPoint position =  CGPointMake(self.frame.size.height/2,self.frame.size.height/2);//center of the view
    CGContextBeginPath(context);
    CGContextAddArc(context, position.x, position.y, radius1, startAngle, endAngle, 1);
    CGContextDrawPath(context, kCGPathFill); // Or kCGPathFill
}
- (void)setBackgroundColor :(NSColor*)color
{
    _backgroundColor = color;
    [self setNeedsDisplay:YES];
}
- (CGColorRef)NSColorToCGColor:(NSColor *)color
{
    NSInteger numberOfComponents = [color numberOfComponents];
    CGFloat components[numberOfComponents];
    CGColorSpaceRef colorSpace = [[color colorSpace] CGColorSpace];
    [color getComponents:(CGFloat *)&components];
    CGColorRef cgColor = CGColorCreate(colorSpace, components);
    return cgColor;
}
//curentlly calling only this 1
- (void)insertGif1
{
    [imageView removeFromSuperview];
     [imageView setImageScaling:NSImageScaleNone];
     [imageView setAnimates: YES];
     imageView.image = [NSImage imageNamed:@"FanBlades11.gif"];
     [self addSubview:imageView];
 }
@end
编辑:我发现了问题的根源:我在RMBlurredView的顶部添加了我的类(代表圆圈内的gif)当我将它添加为子视图时,动画不起作用,但是它可以在我添加的所有其他视图上工作。

任何想法可能是什么原因在RMBlurredView内阻止我的NSImageView从动画?

编辑:我认为[self setWantsLayer:YES];是我没有得到动画的原因启用此功能后,我如何仍能获得动画?

编辑:

这是一个简单的例子,我的问题

http://snk.to/f-cdk3wmfn

my gif:这是我的gif,白色背景色,不可见

"必须禁用NSImageView的自动缩放特性动画回放功能。做完之后,就没有多余的了需要编程。这招真管用!"

——http://www.cocoabuilder.com/archive/cocoa/108530-nsimageview-and-animated-gifs.html

imageView.imageScaling = NSImageScaleNone;
imageView.animates = YES;

需要图层视图:

如果图像视图在图层后置视图中或图层后置视图本身:

imageView.canDrawSubviewsIntoLayer = YES;

使用问题本身的gif:

工作示例
NSImageView *view = [[NSImageView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
view.imageScaling = NSImageScaleNone;
view.animates = YES;
view.image = [NSImage imageNamed:@"FanBlades2_42x42.gif"];
view.canDrawSubviewsIntoLayer = YES;
NSView *layerview = [[NSView alloc] initWithFrame:CGRectMake(0, 0, 60, 60)];
layerview.wantsLayer = YES;
[layerview addSubview:view];
[self.window.contentView addSubview:layerview];

最新更新