获取UIScrollView内容的可见性

我怎样才能find真正在屏幕上显示的显示视图内容的矩形(CGRect)。

myScrollView.bounds 

上面的代码在没有缩放的情况下工作,但是只要允许缩放,它就会以1以外的缩放比例进行分解。

为了澄清,我想要一个CGRect,其中包含相对于内容的滚动视图内容的可见区域。 (即,如果是缩放比例2,那么矩形的大小将是滚动视图大小的一半,如果是缩放比例0.5,则会增加一倍)。

或者你可以简单地做

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

回答我自己的问题,主要归功于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 ,它是内容视图的大小。 也简化了一下math,并没有完全看到isless()的用法,只要它更大就会破坏代码。

您必须使用UIScrollView的contentOffset和contentSize属性来计算它,如下所示:

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

然后,您可以将其logging为完整性testing:

 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; } 

除此之外,我使用了math.h中的isless(),isgreater(),isequal()等,因为这些将会(假设)在“无序”浮点比较结果和其他奇怪的和奇妙的架构特定的FP情况。


编辑:计算visibleRect.size时,您需要使用bounds.size而不是contentSize

更短的版本:

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

我不知道这是否是定义的行为,但几乎所有的UIView子类的bounds的起源设置为(0,0)。 但是,UIScrollViews的原点设置为contentOffset

一个更通用的解决scheme是:

  [scrollView convertRect:scrollView.bounds toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]]; 
 CGRect visibleRect; visibleRect.origin = scrollView.contentOffset; visibleRect.size = scrollView.frame.size; 

我不认为一个UIScrollView直接给你那个矩形,但我认为你有所有必要的项目来计算它。

边界,contentOffset和zoomScale的组合应该是您需要创build您正在寻找的矩形的所有东西。