UIScrollView内にUIImageViewを配置し、ズーム後にスクロールビューの中央に配置されるように画像を制御しようとしています。そして、私はこれを行うための最良の方法がわかりません。
アップルのドキュメントでは、frameプロパティを使用しないように指示されています。「警告変換プロパティがID変換でない場合、このプロパティの値は未定義であるため、無視する必要があります。」そのため、xibにscrollViewが含まれ、imageViewが含まれているUIViewControllerサブクラスで以下を使用しようとしています。
scrollView.bounds =
CGRectMake
(scrollView.contentSize.width/2 - scrollView.center.x,
scrollView.contentSize.height/2 - scrollView.center.y,
scrollView.bounds.size.width,
scrollView.bounds.size.height);
containedView.center =
CGPointMake
(containedView.bounds.size.width*scrollView.zoomScale/2,
containedView.bounds.size.height*scrollView.zoomScale/2);
これは、containedViewの幅と高さがscrollViewの幅と高さよりも大きい場合に正確に機能し、後続のスクロールでcontainedViewの端に正確に移動するようにビューを設定します。ただし、画像のいずれかの寸法がscrollViewの幅と高さよりも小さい場合、画像は画面の左上隅に磁気的に引き付けられます。iPadシミュレーター(のみ)では、画像がminimumZoomのサイズに縮小されると、画面の中央にロックされます。画像が中央に配置された後、UIの何かが私のコードを上書きしているかのように、磁気の引力は非常にスムーズです。CALayerのcontentsGravity(kCAGravityTopLeft)のように見えますか?
Appleは、コードサンプルであるphotoScroller(UIScrollViewのサブクラス)での独自のアドバイスと矛盾しています。
// center the image as it becomes smaller than the size of the screen
CGSize boundsSize = self.bounds.size;
CGRect frameToCenter = imageView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
frameToCenter.origin.x = 0;
// center vertically
if (frameToCenter.size.height < boundsSize.height)
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
frameToCenter.origin.y = 0;
imageView.frame = frameToCenter;
この方法は、画像が小さい場合に中央揃えをより適切に処理しますが、プロジェクトでこれを試してみると、ある種の不整合が発生します。たとえば、scrollView.bounces = NOの場合、高さがscrollViewの高さよりも小さいが、幅が大きい(つまり、左から右にスクロールできる)水平方向の画像は、本来よりも左にスクロールします(右にスクロールすると、画像の端で正しく停止しますが、scrollView.bounces = YESの場合、端から跳ね返るので、画像は常に左側でトリミングされます)画像が含まれているscrollviewよりも両方の次元で大きい場合この問題は強調され、結果全体が壊れているように感じます。これは、Appleの文書化されたアドバイスを考えると驚くことではありません。
私はフォーラムを精査しましたが、これについて多くのコメントを見つけることができません。私は本当に明白な何かを逃していますか?