2009-05-15 10 views
64

実際に画面に表示される表示されたビューのコンテンツの矩形(CGRect)を見つける方法を教えてください。何のズームがありませんときUIScrollViewのコンテンツの表示矩形を取得する

myScrollView.bounds 

上記のコードは動作しますが、できるだけ早くあなたがズーム許す限り、それは明確にするために1

以外のズームスケールで壊し、私はCGRectをしたいの表示領域が含まれていますコンテンツに関連したスクロールビューのコンテンツ(つまり、ズームスケール2の場合、rectのサイズはスクロールビューのサイズの半分になります。ズームスケール0.5の場合、倍精度になります)

+5

あなたの質問自体が私の問題を解決しました。私はscrollviewの目に見えるrectを探していた! +1してください。 –

答えて

80

visibleRectはコンテンツビューのサイズであるscrollView.contentSizeではなく、scrollView.bounds.sizeでなければなりません。また数学を少し簡略化し、より大きいときはいつでもコードを壊すようなisless()の使用法はあまり見当たりませんでした。私は、これは動作を定義しているかどうかわからないんだけど、ほとんどすべてのUIViewのサブクラスが自分の起源を持っている

CGRect visibleRect = CGRectApplyAffineTransform(scrollView.bounds, CGAffineTransformMakeScale(1.0/scrollView.zoomScale, 1.0/scrollView.zoomScale)); 

+0

これはiOS 3.2以降とCATiledLayerで失敗するようです - scrollViewのzoomScaleは何に関係なく常に(たとえばiPadでは):2.0に設定されています。私は、UIScrollViewがiOS 3.2で変更されたことを知っています - おそらく、この回避策が破られましたか?それともそれを壊しているCATiledLayerですか? Sigh – Adam

+0

UPDATE:UIScrollViewDelegateメソッド "scrollViewDidEndZooming:withView:atScale:"の実装を忘れない限り、iOS 4以降では* *動作します。注:このメソッドは空にすることができます!しかし、それは方法がない場合、アップルの実装のバグです...アップルは、独自のzoomScaleプロパティを更新するFAILS(そして、他のバグを知っていますか?) – Adam

+0

@kenneth Ballenegger "スケール"(float theScale = 1.0/scale ;)あなたのコードに? – Hitarth

0

私はUIScrollViewがその矩形を直接、しかしあなたはそれを計算するために必要なすべての項目があると思います。

あなたが探している矩形を作成するためには、bounds、contentOffset、zoomScaleの組み合わせが必要です。

25

あなたが好きなので、UIScrollViewののcontentOffsetとcontentSizeプロパティを使用して、それを計算する必要があります。

CGRect visibleRect; 
visibleRect.origin = scrollView.contentOffset; 
visibleRect.size = scrollView.contentSize; 

あなたはその後、健全性テストのためにそれをログに記録することができます

NSLog(@"Visible rect: %@", NSStringFromCGRect(visibleRect)); 

アカウントへのズーミング(この場合既にcontentSizeプロパティによって行われていない場合)、各座標をzoomScaleで除算する必要があります。または、パフォーマンスを向上させるために1.0/zoomScaleを掛けます。

その他:math.hからisless()、isgreater()、isequal()などを使用しています。これらはおそらく '順序付けられていない'浮動小数点比較結果やその他の奇妙なものについて正しいことをするためです。&素晴らしいアーキテクチャ特有のFP症例。


編集:あなたはvisibleRect.sizeを計算するときbounds.sizeの代わりcontentSizeを使用する必要があります。

CGRect visibleRect; 
visibleRect.origin = scrollView.contentOffset; 
visibleRect.size = scrollView.bounds.size; 

float theScale = 1.0/scale; 
visibleRect.origin.x *= theScale; 
visibleRect.origin.y *= theScale; 
visibleRect.size.width *= theScale; 
visibleRect.size.height *= theScale; 

主な違いは、サイズのことです。自分の質問、ほとんどがかなりトリックを行うが、私は私の答えのための基盤を与えなかったジム・Doveyの答えのおかげで答える

+5

私はvisibleRect.size = scrollView.frame.sizeと思います。 not contentSize)) – oxigen

+0

@property(非アトミック)CGSize contentSize; //デフォルトのCGSizeZero –

2
CGRect visibleRect; 
visibleRect.origin = scrollView.contentOffset; 
visibleRect.size = scrollView.frame.size; 
+1

これはzoomScale = 1.0でのみ動作します –

99

それとも、単に

CGRect visibleRect = [scrollView convertRect:scrollView.bounds toView:zoomedSubview]; 
+0

ベストアンサー。最短で最も正確。 – n13

+7

ズーム付きサブビューとは – zakdances

+2

zoomedSubviewは、表示されているrectを取得したくないサブビューです。 – Trenskow

10

短いバージョンを行うことができますboundsは(0,0)に設定されます。ただし、UIScrollViewsの起点はcontentOffsetに設定されています。

5

もう少し一般的な解決策は次のようになります。

[scrollView convertRect:scrollView.bounds 
          toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]]; 
関連する問題