2013-07-17 1 views
1

В настоящее время я пытаюсь создать представление гистограммы с использованием Core Animation и слоев. Чтобы сделать его более прохладным, я попытался дать каждому лучу немного понемногу, один за другим. Для удобства я перевернул систему координат по вертикали.Core Animation: правильно настроить анимированное свойство

Вот код:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.transform = CGAffineTransformMakeScale(1, -1); 
     self.values = @[@12.5f, @4.25f, @23.0f, @3.0f, @17.9f, @7.0f, @15.1f]; 
    } 
    return self; 
} 

- (void)didMoveToSuperview 
{ 
    self.backgroundColor = [UIColor whiteColor]; 
    self.beamContainer = [CALayer layer]; 
    CGRect frame = CGRectInset(self.bounds, 20, 20); 
    self.beamContainer.frame = frame; 
    self.beamContainer.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1].CGColor; 
    float maxValue = [[self.values valueForKeyPath:@"@max.floatValue"] floatValue]; 
    for (int i = 0; i < self.values.count; i++) { 
     CALayer *beam = [CALayer layer]; 
     CGFloat beamHeight = ([self.values[i] floatValue] * frame.size.height)/maxValue; 

     beam.backgroundColor = [UIColor colorWithRed:0.5 green:0.6 blue:1 alpha:1].CGColor; 
     beam.anchorPoint = CGPointMake(0, 0); 
     beam.position = CGPointMake(frame.size.width * ((float)i/(float)self.values.count), 0); 
     CGRect endBounds = CGRectMake(0, 0, frame.size.width /(float)self.values.count, beamHeight); 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
     animation.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, frame.size.width /(float)self.values.count, 5)]; 
     animation.toValue = [NSValue valueWithCGRect:endBounds]; 
     animation.duration = .5; 
     animation.beginTime = CACurrentMediaTime() + ((float)i * 0.1); 
     [beam addAnimation:animation forKey:@"beamAnimation"]; 

     [self.beamContainer addSublayer:beam]; 
     beam.bounds = endBounds; 
    } 
    [self.layer addSublayer:self.beamContainer]; 
} 

Это работает как шарм, единственная проблема в том, что если я не пишу beam.bounds = endBounds; луч будет хватать назад это старые границы после того, как анимация закончил. Но когда я это сделаю, он будет использовать endBounds еще до того, как анимация запустила и во время задержки для каждой анимации.

Как я могу анимировать луч, идущий от границ A до B и придерживаясь B на конец?

+0

Посмотрите на CATransaction (http://developer.apple.com/library/ios/ipad/#documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html), возможно, он подойдет вашим потребностям лучше. Также см. Этот пост: http://oleb.net/blog/2012/11/prevent-caanimation-snap-back/ – architectpianist

+0

Вы используете автоматическую компоновку? – rdelmar

ответ

0

Вы могли бы попробовать что-то вроде следующего:

// Save the original value 
CGFloat originalY = layer.position.y; 

// Change the model value (this is not animated yet) 
layer.position = CGPointMake(layer.position.x, 300.0); 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position.y"]; 

// Now specify the fromValue for the animation because 
// the current model value is already the correct toValue 
animation.fromValue = @(originalY); 
animation.duration = 1.0; 

// Use the name of the animated property as key 
// to override the implicit animation 
[layer addAnimation:animation forKey:@"position"]; 

хотя это не точное совпадение для СТОЛБЧАТОМ анимации вы пытаетесь, вы можете, вероятно, получить образец из приведенного выше примера. You can read more about it here. Это помогло мне с аналогичной проблемой, которую я имел на днях.

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