0

所以,我想显示一个方形框,当用户点击屏幕时,一个典型的焦点动画。这是我尝试过的:

-(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];


}  

我有几个我似乎无法解决的问题:

  1. 我无法显示我的边框。

  2. 目前我正在从用户点击屏幕的点开始绘制一个正方形。用户点击它的点实际上应该是正方形的中心。

  3. 我似乎无法让动画正确。我想要做的是,减小正方形大小,增加它,然后再减小它,然后alpha = 0.

我想如果我有 3 个不同的单独动画,也许它会起作用,但不起作用。

4

1 回答 1

1

您的问题是触发动画是异步的,因此它们都同时开始,并且前两帧动画被第三帧动画替换。

您可以做的一件事是使用核心动画(您的问题实际上使用 UIView 动画,甚至不是新的块的东西)来为大小和不透明度动画创建一个动画组。它看起来像这样(注意我没有运行它,所以它可能包含拼写错误等)

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
}
于 2013-10-15T13:51:52.677 回答