UIScrollView のコンテンツの表示可能な四角形を取得する
-
22-08-2019 - |
質問
実際に画面上に表示されている、表示されたビューのコンテンツの四角形 (CGRect) を確認するにはどうすればよいですか。
myScrollView.bounds
上記のコードはズームがない場合は機能しますが、ズームを許可するとすぐに 1 以外のズーム スケールで動作しなくなります。
明確にするために、スクロール ビューのコンテンツの表示領域をコンテンツに相対的に含む CGRect が必要です。(すなわち。ズーム スケール 2 の場合、四角形のサイズはスクロール ビューのサイズの半分になり、ズーム スケール 0.5 の場合は 2 倍になります)。
解決 2
自分の質問、非常にトリックを行うが、私は私の答えのための基盤を与えなかったジム・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()
のための使用を見ませんでした。
他のヒント
それとも、単に行うことができます。
CGRect visibleRect = [scrollView convertRect:scrollView.bounds toView:zoomedSubview];
<時間>
スウィフト
let visibleRect = scrollView.convert(scrollView.bounds, to: zoomedSubview)
あなたが好きなので、UIScrollViewののcontentOffsetとcontentSizeプロパティを使用して計算する必要があります:
CGRect visibleRect;
visibleRect.origin = scrollView.contentOffset;
visibleRect.size = scrollView.contentSize;
これで、健全性テストのためにそれをログに記録することができます:
NSLog( @"Visible rect: %@", NSStringFromCGRect(visibleRect) );
(これは既にcontentSizeプロパティによって行われていない場合)は、各zoomScaleによって座標やパフォーマンス向上のためにあなたが1.0 / zoomScaleを掛けう分割する必要があるだろうズームを説明するために:
CGFloat scale = (CGFloat) 1.0 / scrollView.zoomScale;
if ( isless(scale, 1.0) ) // you need to #include <math.h> for isless()
{
visibleRect.origin.x *= scale;
visibleRect.origin.y *= scale;
visibleRect.size.width *= scale;
visibleRect.size.height *= scale;
}
脇:私はisless()を使用し、isgreater()、関数isequal()などのmath.hからこれらは、(おそらく)「順不同」浮動小数点の比較結果と他の奇妙な&素晴らしいアーキテクチャー別に関する正しいことを行いますので、特定のFPケースます。
<時間>編集:あなたはbounds.size
を計算するときcontentSize
の代わりにvisibleRect.size
を使用する必要があります。
短いバージョン:
CGRect visibleRect = CGRectApplyAffineTransform(scrollView.bounds, CGAffineTransformMakeScale(1.0 / scrollView.zoomScale, 1.0 / scrollView.zoomScale));
私は、これが定義された動作であるかどうかわからないんだけど、ほとんどすべてのUIViewのサブクラスは、(0,0)に設定し、そのbounds
の起源を持っています。 UIScrollViewsは、しかし、起源はcontentOffset
に設定されています。
もう少し一般的な解決策は以下のようになります:
[scrollView convertRect:scrollView.bounds
toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]];
CGRect visibleRect;
visibleRect.origin = scrollView.contentOffset;
visibleRect.size = scrollView.frame.size;
私はUIScrollViewのは、直接あなたにその長方形を与えることはないと思うが、私はあなたがそれを計算するために必要なすべてのアイテムを持っていると思う。
境界の組み合わせ、contentOffsetとzoomScaleは、あなたが探している四角形を作成するために必要なすべてである必要があります。
スイフト4.0:
私の答えは適応します トレンスコフの答え Swift 4.0 へ:
let visible = scrollView.convert(scrollView.bounds, to: subView)
どこ scrollView
はスクロールのビューであり、 subView
中の景色です scrollView
これはズーム可能で、スクロール内のすべてのコンテンツが含まれています。