1

UIViewアニメーションで何か奇妙なことに遭遇しました。アニメーションは、長方形からサブビューを拡大縮小して、その親ビューを塗りつぶします。

//update views
CGRect startRect = ...; //A rect in parentView co-ordinates space that childView appears from
UIView *parentView = ...;
UIView *childView = ...;
[parentView addSubview:childView];

//animation start state
childView.alpha = 0;
childView.center = (CGPointMake( CGRectGetMidX(startRect),  CGRectGetMidY(startRect)));
//TODO: set childViews transform and so that it is completely contained with in startRect
childView.transform = CGAffineTransformMakeScale(.25, .25); 

[UIView animateWithDuration:.25 animations:^{
    childView.transform = CGAffineTransformIdentity;        
    childView.alpha = 1;
    childView.frame = parentView.bounds;
}];

上記のコードは期待どおりに機能します。ただし、アニメーションブロックを次のように並べ替えると、アニメーションは途方に暮れます(スケールが大きくなり、中心点が画面外になります)。

[UIView animateWithDuration:.25 animations:^{
    childView.frame = parentView.bounds; //This line was after .alpha
    childView.transform = CGAffineTransformIdentity;        
    childView.alpha = 1;
}];

何が起きてる?プロパティが設定される順序がアニメーションにとって重要なのはなぜですか?

4

1 に答える 1

1

変換が恒等変換でない場合、フレームは定義されていないため、プロパティの順序はおそらく関係があります。

警告:プロパティが恒等変換でない場合、transformこのプロパティの値は定義されていないため、無視する必要があります。

frame(on UIView)のドキュメントから

これはフレーム値を取得する場合に当てはまりますが、フレームを設定する場合にも当てはまると思います。

ビューレイヤーのプレゼンテーションでアニメーション化される前に、アニメーションブロックの変更がビューレイヤーのモデルで発生することはほぼ確実です。

トランスフォームがスケールの状態から来ているため、フレームの設定は未定義です。

一番上の例では、フレームを設定する前に変換がアイデンティティに設定されているため、期待どおりに機能しますが、2番目の例では、変換を復元する前にフレームを設定しています。

于 2012-10-09T11:12:14.990 に答える