2009-03-04 8 views
1

私はUIScrollViewに画像と、ユーザーがScrollViewの内部で画像を切り替えることを可能にするセグメント化されたコントロールを含んでいます。私がUIImageViewの内部にイメージをスワップするだけでは、新しいイメージがズームインされた状態で表示されます。 UIScrollViewをズームしていない状態に戻すにはどうすればよいですか?UIScrollViewをリセット(つまりズーム解除)するにはどうすればよいですか?

答えて

2

私は、UIScrollViewズームがどのように(そしてなぜ)なぜ機能するのか、詳細な説明をgithub.com/andreyvit/ScrollingMadness/で行っています。

(リンクはまた、ズーム魔法の一部をカプセル化フォトライブラリスタイルのページング+ズーム+スクロール、サンプルプロジェクトとZoomScrollViewクラスをエミュレートする方法を、プログラム的にUIScrollViewのをズームする方法の説明が含まれています。)

UIScrollViewには現在のズームレベルという概念がありません。これは、それぞれのサブビューには現在のズームレベルが設定されている可能性があるためです。 UIScrollViewには、現在のズームレベルを保持するフィールドはありません。ただし、サブビューをピンチズームしてから変換をCGAffineTransformIdentityにリセットしてから再びピンチすると、サブビューの以前のズームレベルが復元されていることに気づくでしょう。

実際、逆アセンブリを見ると、独自のズームレベル(_gestureInfoフィールドが指すUIGestureInfoオブジェクト内)を格納するのはUIViewです。それには、zoomScalesetZoomScale:animated:のような素敵な文書化されていないメソッドもあります。 (あなたには回転関連の方法がたくさんありますが、まもなくすぐにローテーションジェスチャをサポートしています。)

ただし、ズーム用に新しいUIViewを作成し、実際のズーム可能なビューをその子では、常にズームレベル1.0から開始します。プログラムによるズームの実装は、このトリックに基づいています。

+1

現在、公式の 'zoomScale'プロパティがあるようです。 – BastiBen

0

ピンチズームイベントの完了時にビューを再描画しない場合は、viewForZoomingInScrollView:delegateメソッドから返されたビューのtransformプロパティによってズーム係数が設定されます。このズームをリセットするには、ビューのtransformプロパティの値をCGAffineTransformIdentityに設定します。

しかし、次のピンチズーム操作は、以前のピンチズームがオフになったところから開始されます(つまり、新しいスケールは無視されます)。この問題を回避するには、私が説明しているものの一部を実装する必要がありますhere

+0

画像を切り替えると、次のようになります。 \t imageView.transform = CGAffineTransformIdentity; それはあなたが意味するものですか?それはそれを行うようには見えないからです。 – Bdebeez

+0

どのように画像を切り替えるのですか? UIScrollViewのコンテンツビューはUIImageViewですか?このUIImageViewは、あなたがviewForZoomingInScrollViewから返すものですか?これは、スクロールビューのメインサブビューで機能するはずです。 –

+0

はい、私はそれをやっているのです。 Scollビューには、UIImageViewという1つのサブビューが含まれています。選択が変更されたときに、別のUIImageにその.imageプロパティを設定しています。 – Bdebeez

関連する問題