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