0

ここで尋ねられたUIScrollViewの質問の多くを読みましたが、この問題に答えたものはありませんでした。

他のサブビューを含むビューをズームするUIScrollViewがあります。ズームが発生しているときは、ビューのサブビューを特定の場所に移動する必要があります。UIScrollViewのlayoutSubviewsメソッドでフレームを適宜変更することで、これを実現できます。

iOS 3.2以下では、これは、zoomToRect:animated:メソッドを使用した指ズームと実用的なズームの両方でうまく機能します。

iOS 4.0以降では、これは指のズームにのみ最適です。ZoomToRect:animated:を使用した実用的なズームでは、layoutSubviewsの呼び出しは1回だけ(ズームの最後に)発生します。サブビューがズームとともにスムーズな位置変更を行えるように、ズーム中に何度もこのメソッドを呼び出す必要があります。

したがって、要約すると、iOS 3.2では、layoutSubviewsの呼び出しは何度も発生し、iOS 4.0では、zoomToRect:animated:を呼び出したときにlayoutSubviewsの呼び出しは1回だけ発生します。誰かが私の問題の解決策を知っていますか?

4

1 に答える 1

2

IOS 4.0 では、アニメーションは OS によって行われます。GPU ベースのハードウェア アクセラレーションを可能な限り利用することを想定しています。その欠点として、別の (アニメーション化された) 値から派生した値をアニメーション化することが難しくなります。あなたの場合のように、UIScrollView のズーム レベルに依存するサブビューの位置。これを実現するには、ズームのアニメーションと並行してサブビューのアニメーションを設定する必要があります。次のようなものを試してください:

[UIView animateWithDuration:0.5 delay:0
                    options:UIViewAnimationOptionLayoutSubviews
                 animations:^{
    theScrollView.zoomScale = zoomScale;
    [theScrollView layoutSubViews];
} completion:^(BOOL finished) {}];

これにより、同じアニメーション コンテキスト内からサブビューのフレーム プロパティが設定されるため、OS によって一緒にアニメーション化される必要があります。明示的な layoutSubViews が必要かどうか、または UIViewAnimationOptionLayoutSubviews オプションが既にそれを実現しているかどうかはわかりません。

この質問への回答も参照してください:アニメーション中に UIScrollView が scrollViewDidScroll メッセージを送信するようにする方法

于 2011-09-26T10:29:31.410 に答える