所以,我想显示一个方框,这是用户点击屏幕时的典型焦点动画。这是我尝试过的:
-(void)showFocusAnimation:(CGPoint)location{
UIView *square = [[UIView alloc]initWithFrame:CGRectMake(location.x, location.y, 40, 40)];
square.alpha=1.0;
square.layer.borderColor = (__bridge CGColorRef)[UIColor colorWithRed:12.0/255.0 green:185.0/255.0 blue:249.0/255.0 alpha:1];
square.layer.borderWidth = 2.0;
[overlayView addSubview:square];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.1];
square.frame = CGRectMake(location.x, location.y, 90, 90);
[UIView commitAnimations];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.1];
square.frame = CGRectMake(location.x, location.y, 40, 40);
[UIView commitAnimations];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.2];
square.frame = CGRectMake(location.x, location.y, 90, 90);
square.alpha = 0;
[UIView commitAnimations];
}
我有几个问题似乎无法解决:
我无法显示我的边框。
目前,我正在从用户点击屏幕的点开始绘制一个正方形。用户点击它的点实际上应该是正方形的中心。
我似乎无法正确制作动画。我想要做的是,减小正方形大小,增加它,然后再次减小它,然后是
alpha = 0
。
我想如果我有 3 个不同的独立动画也许它会起作用,但不起作用。
最佳答案
您的问题是触发动画是异步的,因此它们都同时开始,并且前两帧动画被第三帧动画取代。
您可以做的一件事是使用核心动画(您的问题实际上使用 UIView 动画,甚至不使用新的 block 内容)来为大小和不透明度动画创建动画组。它看起来像这样(注意我没有运行这个,所以它可能包含拼写错误等)
CAKeyframeAnimation *resize = [CAKeyframeAnimation animationWithKeyPath:@"bounds.size"];
resize.values = @[[NSValue valueWithCGSize:CGSizeMake(40, 40)],
[NSValue valueWithCGSize:CGSizeMake(90, 90)],
[NSValue valueWithCGSize:CGSizeMake(40, 40)],
[NSValue valueWithCGSize:CGSizeMake(90, 90)]];
resize.keyTimes = @[@0, @.25, @.5, @1];
CABasicAnimation *fadeOut = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeOut.toValue = @0;
fadeOut.beginTime = .2;
CAAnimationGroup *both = [CAAnimationGroup animation];
both.animations = @[resize, fadeOut];
CALayer *squareLayer = nil; // Your layer code here.
[squareLayer addAnimation:both forKey:@"Do the focus animation"];
// Make sure to remove the layer after the animation completes.
需要注意的是:
- 我正在对
bounds.size
进行动画处理,因为框架并没有真正改变,而且最好保持精确。 - 该组有总持续时间
- keyTimes 指定为 0 到 1
- 动画完成后,将从图层中删除。
由于动画中的最后一件事是将不透明度淡化为 0,因此您应该在完成后将其删除。一种方法是成为该组的代表并实现
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
// remove layer here since it should have faded to 0 opacity
}
关于ios - AVFoundation 焦点动画使用 Core Animation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381764/