如何找到屏幕上实际可见的显示视图的内容的矩形(CGRect)。
myScrollView.bounds
上面的代码在没有缩放时起作用,但是一旦允许缩放,它就会以非1的缩放比例中断。
为了澄清,我想要一个CGRect,其中包含滚动视图内容相对于内容的可见区域。(即,如果缩放比例为2,则矩形的大小将为滚动视图大小的一半,如果缩放比例为0.5,则其大小将为两倍。)
如何找到屏幕上实际可见的显示视图的内容的矩形(CGRect)。
myScrollView.bounds
上面的代码在没有缩放时起作用,但是一旦允许缩放,它就会以非1的缩放比例中断。
为了澄清,我想要一个CGRect,其中包含滚动视图内容相对于内容的可见区域。(即,如果缩放比例为2,则矩形的大小将为滚动视图大小的一半,如果缩放比例为0.5,则其大小将为两倍。)
Answers:
或者你可以简单地做
CGRect visibleRect = [scrollView convertRect:scrollView.bounds toView:zoomedSubview];
迅速
let visibleRect = scrollView.convert(scrollView.bounds, to: 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
内容视图的大小。还简化了数学运算,并没有完全看到for的用法,isless()
只要代码更大,它将破坏代码。
您必须使用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;
}
另外:我使用math.h中的isless(),isgreater(),isequal()等,因为这些(大概)将对“无序”浮点比较结果以及其他奇怪而美妙的特定于FP的情况做正确的事情。
编辑:计算时需要使用bounds.size
而不是。contentSize
visibleRect.size
通用的解决方案是:
[scrollView convertRect:scrollView.bounds
toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]];
我认为UIScrollView不能直接为您提供该矩形,但我认为您拥有所有必要的计算对象。
边界,contentOffset和zoomScale的组合应该是创建所需矩形的全部。