2

私は UIView サブクラス (以下のコードの CustomView ) の中にいます。

UIImageView サブクラス (containerView) で画像の周囲に境界線を描画しています。このための Core Graphics コードはdrawInRect:、サブクラス内にあります。

Core Animation トランジションはフリップですが、描画時に Core Graphics コードは使用されません。つまりdrawInRect:、レンダリングされたイメージを CALayer に提供するために呼び出されません。

代わりに、Core Graphics の描画を行わずに、ある画像から別の画像へのアニメーションを取得します。

生の画像ではなく Core Graphics の描画を使用して CALayer をアニメーション化するにはどうすればよいですか?

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView setImage:image];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[containerView setImage:differentImage];
[CustomView commitAnimations];
4

2 に答える 2

3

はい、私は実装drawRect:していました。はい、私の描画はトランジションの外で機能しました。

問題はdrawRect:、サブクラス内UIImageViewが図面のCALayerによって呼び出されていなかったことです。

したがって、このサブクラスの親をに切り替え、UIView画像に独自のプロパティを実装し、アニメーションも調整すると、すべてが一緒になりました。

containerView上記のコードのアニメーションは、バニラUIViewインスタンスに変更されました。これに対応するために、アニメーションコードを少し変更する必要がありました。

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView addSubview:aViewSubclass];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[aViewSubclass removeFromSuperview];
[containerView addSubview:anotherInstanceOfTheViewSubclass];
[CustomView commitAnimations];

つまり、これらの種類の遷移に関するAppleのドキュメントから:

遷移中にビューの外観を変更する場合(たとえば、あるビューから別のビューに切り替える場合)、次のように、UIViewのインスタンスであるコンテナビューを使用します。

  1. アニメーションブロックを開始します。
  2. コンテナビューでトランジションを設定します。
  3. コンテナビューからサブビューを削除します。
  4. 新しいサブビューをコンテナビューに追加します。
  5. アニメーションブロックをコミットします。
于 2009-01-15T08:09:16.260 に答える
2

drawRect:ではなくを実装していますよねdrawInRect:?また、この移行以外で実際に機能することを確認しましたか?

drawRect:実装を貼り付けることはできますか? UIImageView がレイヤーのコンテンツを設定するのではなく、レイヤーのコンテンツを直接設定することを恐れています。これは、機能しないdrawRect:ことを意味します。drawRect:

実際、これが実際にいかに単純であるかを考えると、UIImageView の代わりに UIView をサブクラス化することをお勧めします。描画用に画像をスケーリングするときに縦横比を維持する計算は非常に簡単です。

別のオプションは、もちろん、UIImageView をサブクラス化し、オーバーライドsetImage:して、最初のイメージに基づいて新しいイメージを作成し、その周りに境界線を描画してから、それをスーパーに渡すことです。そうすれば、何もする必要はまったくありませんdrawRect:

于 2009-01-14T11:20:07.980 に答える