获取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您正在寻找的矩形的所有东西。