Core Animation:正确设置动画属性
问题描述:
我目前正在尝试使用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上end?
答
你可以尝试像以下:
// 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.它帮助我解决了前几天发生的类似问题。
看看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
你使用自动布局? – rdelmar