2012-02-02 2 views
0

Это сводит меня с ума. Я пытаюсь изменить пользовательское свойство «mycolor» подкласса CALayer, это мой код:Цветная собственность в подклассе CALayer

#import "Circle" 

@interface Circle() 
    @property (nonatomic, strong) UIColor * mycolor; 
    @property (nonatomic) float initial_angle; 
    @property (nonatomic) float end_angle; 
@end 

@implementation Circle 

@synthesize mycolor; 
@synthesize initial_angle, end_angle; 

- (id) init { 
    self = [super init]; 
    if (self) { 

     CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX; 
     CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX; 
     CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX; 
     self.mycolor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; 
     self.backgroundColor = [UIColor clearColor].CGColor; 

    } 
    return self; 
} 


-(void) changeColor { 
    CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX; 
    CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX; 
    CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX; 
    self.mycolor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; 
} 

- (void) animate { 
    float final = arc4random() % 360; 
    float afrom = self.initial_angle; 
    self.initial_angle = final; 
    CABasicAnimation * anim = [CABasicAnimation animationWithKeyPath:@"initial_angle"]; 
    anim.fromValue = [NSNumber numberWithFloat:afrom]; 
    anim.toValue = [NSNumber numberWithFloat:final]; 
    anim.duration = 5; 
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    [self addAnimation:anim forKey:@"initial_angle"]; 

    final = arc4random() % 360; 
    afrom = self.end_angle; 
    self.end_angle = final; 
    anim = [CABasicAnimation animationWithKeyPath:@"end_angle"]; 
    anim.fromValue = [NSNumber numberWithFloat:afrom]; 
    anim.toValue = [NSNumber numberWithFloat:final]; 
    anim.duration = 5; 
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    [self addAnimation:anim forKey:@"end_angle"];  

} 

- (void) drawInContext:(CGContextRef)ctx { 

    CGContextMoveToPoint(ctx, 50, 50); 
    CGContextAddArc(ctx, 50, 50, 50, initial_angle*M_PI/180, end_angle*M_PI/180, 0); 
    CGContextClosePath(ctx); 
    NSLog(@"%@", self.mycolor); 

    CGContextSetFillColorWithColor(ctx, self.mycolor.CGColor); 
    CGContextFillPath(ctx); 

} 

+ (BOOL)needsDisplayForKey:(NSString*)key { 
    if ([key isEqualToString:@"initial_angle"]|| 
     [key isEqualToString:@"end_angle"]|| 
     [key isEqualToString:@"mycolor"]) { 
     return YES; 
    } else { 
     return [super needsDisplayForKey:key]; 
    } 
} 

@end 

changeColor и одушевленные общественные методы. Анимация вызывается каждую секунду и меняет цвет каждый раз, когда пользователь набирает круг.

Все работает отлично, за исключением того, что в «drawInContext» mycolor всегда имеет значение null. Не знаю, почему.

+0

Как вы создаете экземпляры 'Circle'? –

+0

Да, я это делаю. – Odrakir

+0

Я считаю, что вы должны подклассифицировать метод + layer, а не init для CALayer. –

ответ

1

Вы пытались зарегистрировать значение mycolor сразу после его установки?

Ваш код выглядит здоровым, поэтому определенно происходит что-то странное. Возможно ли, что вы создали пользовательский метод setter или getter для mycolor где-то и не реализовали его правильно?

Я предполагаю, что вы используете ARC - вы пытались установить mycolor ivar напрямую, а не через сеттер? (В АРК, что должно быть хорошо - это не будет течь или получить освобождены неожиданно)

+0

Если я зарегистрирую mycolor после того, как установил его, это нормально. Он только терпит неудачу в drawInContext. Но я только что узнал, что это не всегда null. Когда анимация заканчивается и перед тем, как она начнется снова, появится рамка, чтобы круг мигал в течение миллисекунды с цветом, и он регистрирует цвет в порядке. Так что я предполагаю, что это имеет какое-то отношение ко мне, пытаясь установить цвет на слой модели, а не на слой представления, это тот, который анимируется ... ?? – Odrakir

+0

Вы рассматривали использование CAShapeLayer вместо этого подхода? Если вы пытаетесь нарисовать анимированный многоугольник, заполненный цветом с использованием CALayers, я думаю, что CAShapeLayer в значительной степени выполнил всю работу для вашего уже. –

+0

Вы имеете в виду подкласс CAShapeLayer? – Odrakir

0
@synthesize mycolor = _mycolor; 
_mycolor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; 

попробовать использовать _mycolor в методе инициализации и drawInContext.

CGContextSetFillColorWithColor(ctx, self.mycolor.CGColor); 

Я думаю, что в drawInContext вы можете просто использовать переменную экземпляра вместо свойства.

0

Правильный инициализатор для CALayer является +layer, вы должны переопределить +layer метод вместо -init, который, возможно, даже не называется вообще.

Смежные вопросы