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

あなたの問題は、アニメーションのトリガーが非同期であるため、すべてが同時に開始され、最初の 2 つのフレーム アニメーションが 3 つ目のフレーム アニメーションに置き換えられることです。

代わりにできることの 1 つは、Core Animation を使用して (あなたの質問は実際には 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 にフェードすることなので、完了したら不透明度を削除する必要があります。これを行う 1 つの方法は、グループのデリゲートになり、実装することです。

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    // remove layer here since it should have faded to 0 opacity
}
于 2013-10-15T13:51:52.677 に答える