68

インスタンスの変更をアニメーション化しようとしてcornerRadiusいますが、変更がすぐに行われます。UIViewlayercornerRadius

コードは次のとおりです。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];
view.layer.masksToBounds = YES;
view.layer.cornerRadius = 10.0;
[UIView animateWithDuration:1.0 animations:^{
    
    [view.layer.cornerRadius = 0.0;
    
}];

ヒントを教えてくれるすべての人に感謝します。

編集:

Core Animationを使用して、このプロパティをアニメーション化することができましたCABasicAnimation

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.fromValue = [NSNumber numberWithFloat:10.0f];
animation.toValue = [NSNumber numberWithFloat:0.0f];
animation.duration = 1.0;
[viewToAnimate.layer addAnimation:animation forKey:@"cornerRadius"];
[animation.layer setCornerRadius:0.0];
4

8 に答える 8

90

tl;dr:では角の半径がアニメートできませんanimateWithDuration:animations:


ビュー アニメーションに関するドキュメントの内容。

「View Programming Guide for iOS」のアニメーションに関するセクションにあるように

UIKit と Core Animation の両方がアニメーションのサポートを提供しますが、各テクノロジによって提供されるサポートのレベルは異なります。UIKit では、UIView オブジェクトを使用してアニメーションを実行します。

古いものを使用してアニメーション化できるプロパティの完全なリスト

[UIView beginAnimations:context:];
[UIView setAnimationDuration:];
// Change properties here...
[UIView commitAnimations];

または新しい

[UIView animateWithDuration:animations:];

(使用している)は次のとおりです。

  • フレーム
  • 境界
  • 中心
  • 変換 (CATransform3D ではなく、CGAffineTransform)
  • アルファ
  • 背景色
  • contentStretch

ご覧のとおりcornerRadius、リストにありません。

若干の混乱

UIView アニメーションは、実際にはビュー プロパティをアニメーション化することのみを目的としています。人々を混乱させるのは、UIView アニメーション ブロック内のレイヤーで同じプロパティ、つまりフレーム、境界、位置、不透明度、背景色をアニメーション化できることです。そのため、人々は内部のレイヤー アニメーションを見animateWithDurationて、そこにある任意のビュー プロパティをアニメーション化できると信じています。

同じセクションは次のように続けています。

より高度なアニメーション、または UIView クラスでサポートされていないアニメーションを実行したい場所では、Core Animation とビューの下位レイヤーを使用してアニメーションを作成できます。ビュー オブジェクトとレイヤー オブジェクトは複雑にリンクされているため、ビューのレイヤーに対する変更はビュー自体に影響します。

数行下に、Core Animation のアニメート可能なプロパティのリストが表示されています。

  • レイヤーの境界線 (レイヤーの角が丸くなっているかどうかを含む)

したがって、更新された質問(および回答)ですでに述べたように、コアアニメーションを使用cornerRadiusする必要があるアニメーション化するには。その理由を説明しようと追加しました。


追加の説明

これがアニメーション化の推奨される方法であるというドキュメントを人々が読むとanimateWithDuration、CABasicAnimation、CAAnimationGroup、CAKeyframeAnimation などを置き換えようとしていると簡単に信じられますが、実際にはそうではありません。beginAnimations:context:上記のとを置き換えcommitAnimationsます。

于 2012-05-20T14:14:21.113 に答える
15

角の半径のバリエーションはアニメーション化できますが、これを行う唯一の方法は CABasicAnimation を使用することです。これが誰かを助けることを願っています。

于 2011-06-24T08:44:59.493 に答える
1

ビュークラスに+[UIView animateWithDuration:]実装することで、このプロパティをアニメーション化できます。方法の例については、この質問-[actionForLayer:forKey]を参照してください。

于 2012-06-05T17:49:52.177 に答える