73

実際に画面に表示されている表示ビューのコンテンツの rect (CGRect) を見つけるにはどうすればよいですか。

myScrollView.bounds

上記のコードは、ズームがない場合は機能しますが、ズームを許可するとすぐに、1 以外のズーム スケールで機能しなくなります。

明確にするために、スクロールビューのコンテンツの表示領域をコンテンツに相対的に含む CGRect が必要です。(つまり、ズーム スケール 2 の場合、rect のサイズはスクロール ビューのサイズの半分になり、ズーム スケール 0.5 の場合、2 倍になります。)

4

8 に答える 8

112

または、単に行うことができます

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

迅速

let visibleRect = scrollView.convert(scrollView.bounds, to: zoomedSubview)
于 2012-07-03T09:39:39.623 に答える
84

私自身の質問に答えるのは、主にJim Doveyの答えのおかげです。これはうまくいきませんでしたが、私の答えのベースを与えてくれました。

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;

主な違いは、visibleRectのサイズは、コンテンツビューのサイズではscrollView.bounds.sizeなく、である必要があることです。また、数学を少し単純化し、それが大きいときはいつでもコードを壊すscrollView.contentSizeようなの使用法をまったく見ていませんでした。isless()

于 2009-05-16T09:41:58.237 に答える
10

短いバージョン:

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

これが定義された動作であるかどうかはわかりませんが、ほとんどすべての UIView サブクラスの原点がbounds(0,0) に設定されています。ただし、UIScrollViews の原点は に設定されていcontentOffsetます。

于 2012-08-06T23:06:35.380 に答える
6

もう少し一般的な解決策は次のとおりです。

 [scrollView convertRect:scrollView.bounds
                             toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]];
于 2013-12-12T12:54:01.197 に答える
3
CGRect visibleRect;
visibleRect.origin = scrollView.contentOffset;
visibleRect.size = scrollView.frame.size;
于 2012-01-30T16:18:18.093 に答える
0

UIScrollView がその長方形を直接提供するとは思いませんが、それを計算するために必要なすべての項目があると思います。

探している四角形を作成するために必要なのは、境界、contentOffset、および zoomScale の組み合わせだけです。

于 2009-05-15T13:04:20.580 に答える