UIScrollViewをリセット(つまり、ズーム解除)するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/611865

質問

画像と、ユーザーが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に設定します。

ただし、次のピンチズーム操作は、前のピンチズームが中断したところから開始されることに注意してください(つまり、新しいスケールは無視されます)。これを回避するには、説明したもののいくつかを実装する必要がありますこちら

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top