动画自定义属性

时间:2014-10-24 00:41:48

标签: objective-c xcode uiview calayer

我试图为自定义属性制作动画,正如我在几个来源上看到的那样,这似乎是要走的路,但我错过了一些东西。这是CALayer子类:

@implementation HyNavigationLineLayer

@dynamic offset;

- (instancetype)initWithLayer:(id)layer
{
    self = [super initWithLayer:layer];

    if (self) {

        HyNavigationLineLayer * other = (HyNavigationLineLayer*)layer;
        self.offset = other.offset;
    }

    return self;
}

-(CABasicAnimation *)makeAnimationForKey:(NSString *)key
{
    // TODO
    return nil;
}

- (id<CAAction>)actionForKey:(NSString *)event
{
    if ([event isEqualToString:@"offset"]) {
        return [self makeAnimationForKey:event];
    }

    return [super actionForKey:event];
}

+ (BOOL)needsDisplayForKey:(NSString *)key
{
    if ([key isEqualToString:@"offset"]) {
        return YES;
    }

    return [super needsDisplayForKey:key];
}

- (void)drawInContext:(CGContextRef)ctx
{
    NSLog(@"Never gets called");
}

@end

我认为这是我认为唯一相关的方法:

@implementation HyNavigationLineView

+ (Class)layerClass
{
    return [HyNavigationLineLayer class];
}

@end

最后,在我的视图控制器中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Instantiate the navigation line view
    CGRect navLineFrame = CGRectMake(0.0f, 120.0f, self.view.frame.size.width, 15.0f);
    self.navigationLineView = [[HyNavigationLineView alloc] initWithFrame:navLineFrame];

    // Make it's background transparent
    self.navigationLineView.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.0f];
    self.navigationLineView.opaque = NO;

    [[self.navigationLineView layer] addSublayer:[[HyNavigationLineLayer alloc] init]];
    [self.view addSubview:self.navigationLineView];
}

尽管drawInContextlayerClass,但根本不会调用{{1}}方法。我错过了让图层绘制的东西吗?

1 个答案:

答案 0 :(得分:0)

解决了它。需要致电setNeedsDisplay

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Instantiate the navigation line view
    CGRect navLineFrame = CGRectMake(0.0f, 120.0f, self.view.frame.size.width, 15.0f);
    self.navigationLineView = [[HyNavigationLineView alloc] initWithFrame:navLineFrame];

    // Make it's background transparent
    self.navigationLineView.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.0f];
    self.navigationLineView.opaque = NO;

    [[self.navigationLineView layer] addSublayer:[[HyNavigationLineLayer alloc] init]];
    [self.view addSubview:self.navigationLineView];
    [self.navigationLineView.layer setNeedsDisplay];
}