画像と、ユーザーが ScrollView 内で画像を切り替えることができるセグメント化されたコントロールを含む UIScrollView があります。UIImageView 内で画像を交換するだけで、新しい画像がズームイン状態で表示されます。UIScrollView をズームインしていない状態にリセットするにはどうすればよいですか?
2 に答える
github.com/andreyvit/ScrollingMadness/で、UIScrollView ズームがどのように (そしてなぜ) 機能するかについて詳しく説明しています。
(リンクには、UIScrollView をプログラムでズームする方法、フォト ライブラリ スタイルのページング + ズーム + スクロールをエミュレートする方法、サンプル プロジェクト、およびズーム マジックの一部をカプセル化する ZoomScrollView クラスの説明も含まれています。)
見積もり:
UIScrollView には「現在のズーム レベル」という概念がありません。これは、含まれる各サブビューに独自の現在のズーム レベルがある可能性があるためです。UIScrollView には、現在のズーム レベルを維持するためのフィールドがないことに注意してください。ただし、サブビューをピンチズームし、その変換を CGAffineTransformIdentity にリセットして再度ピンチすると、サブビューの以前のズーム レベルが復元されていることがわかるため、誰かがそのズーム レベルを保存していることがわかります。
実際、逆アセンブルを見ると、独自のズーム レベルを格納しているのは UIView です (_gestureInfo フィールドが指す UIGestureInfo オブジェクト内)。また、 や のような文書化されていない優れたメソッドのセットもzoomScale
ありsetZoomScale:animated:
ます。(注意してください、それには回転関連のメソッドもたくさんあります。近いうちに回転ジェスチャがサポートされるかもしれません。)
ただし、ズーム専用の新しい UIView を作成し、実際のズーム可能なビューをその子として追加すると、常にズーム レベル 1.0 から開始されます。プログラムによるズームの実装は、このトリックに基づいています。
ピンチズームイベントの完了時にビューを再描画しない場合、ズーム係数は、viewForZoomingInScrollView:デリゲートメソッドから返すビューのtransformプロパティによって設定されます。このズームをリセットするには、ビューの変換プロパティの値をCGAffineTransformIdentityに設定します。
ただし、次のピンチズーム操作は、前のピンチズームが中断したところから開始されることに注意してください(つまり、新しいスケールは無視されます)。これを回避するには、ここで説明する内容の一部を実装する必要がある場合があります。