2012-05-04 11 views
1

私はUISmrollViewをUIScrollViewの中に入れて、ズーム後にスクロールビューの中央にくるように画像を制御しようとしています。私はこれを行うための最善の方法はわかりません。UIView UIScrollview - フレーム、境界、中心混乱

フレームプロパティを使用しないことをAppleのドキュメントで教えてください: "警告トランスフォームプロパティが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のそれよりも大きくなっているので、ビューを設定しますここは正確に動作しますそれ以降のスクロールでは、含まれているビューの端まで正確に移動します。しかし、画像のいずれかの寸法がscrollViewの幅と高さよりも小さい場合、画像は磁気的に画面の左上隅に引き寄せられます。 iPad Simulator(only)では、画像が最小Zoomのサイズに収縮すると画面の中央に固定されます。磁気吸引力は、画像が中央に配置された後、UIの何かが自分のコードを上書きしているかのように非常に滑らかです。おそらくCALayerのcontentsGravity(kCAGravityTopLeft)のように見えますか?

Appleは自分のコードサンプル、(UIScrollViewのサブクラスで)photoScrollerで自分自身の助言を否定:

// 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の場合はエッジから跳ね返って画像が常に左に切り取られます)画像が含まれているスクロールビューよりも両方の寸法が大きい場合この問題は顕著であり、結果全体が壊れていると感じています。これは、アップルの文書化されたアドバイスによれば驚くべきことではありません。

私はフォーラムを精査しましたが、これに関する多くのコメントは見つかりませんでした。本当に明白な何かが欠けていますか?

答えて

0

transformプロパティを使用しているようには見えないため、transformプロパティを使用するときにframeプロパティを使用しないという警告は無視してください。 Apple(と私たちの残りの部分)のように、フレームプロパティを使用してください。

+0

このメソッドは、zoom inとzoom outでscrollViewDidZoomによって呼び出されるため、変換はもはや恒等変換ではありません。いずれの場合でも、上記のフレームはこのスクロールグリッチを導入しています。私は、各アルゴリズムが使用している数値をNSLogするとき、それらは同じであるように見えるので、私はそれをもっと奇妙なものとみなします。 – foundry

+0

より正確に、アイデンティティ変換はscrollViewのために変更されません。だから私はscrollViewsのフレームを使用することができますが、私はそれを使用していません。 – foundry

+0

私はまず、画像をスクロールビューにインポートするアルゴリズムを設定するときに、このグリッチを発見しました。私はスクロールビューを「アスペクト充足」するように設定し、画像が必ずしも正しくインポートされないことに気付きました。同じ画像であっても任意のサイジングが発生することがありました。私はフレームのプロパティを使用して停止し、問題が消えた(しかし、私はそれを補うためにこの問題を取得!) – foundry

関連する問題