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