ios - Core Animation: Setting animated property correctly -


i trying build bar graph view using core animation , layers. make cooler tried let each beam pop bit, 1 after another. convenience flipped coordinate system of view vertically.

here's code:

- (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];     (int = 0; < 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]; } 

this works charm, problem if don't write beam.bounds = endbounds; beam snap it's old bounds after animation finished. when do, it's going use endbounds before animation has started , during delay each animation.

how can animate beam going bounds b , sticking b @ end?

you try following:

// save original value cgfloat originaly = layer.position.y;  // change model value (this not animated yet) layer.position = cgpointmake(layer.position.x, 300.0);  cabasicanimation *animation = [cabasicanimation animationwithkeypath:@"position.y"];  // specify fromvalue animation because // current model value correct tovalue animation.fromvalue = @(originaly); animation.duration = 1.0;  // use name of animated property key // override implicit animation [layer addanimation:animation forkey:@"position"]; 

although not exact match bar graph animations trying, can pattern above example. you can read more here. helped me similar issue had other day.


Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -