在我的应用程序中,我有大面积(≈5000x5000pts),我必须允许用户只看到(+缩放,滚动)其特定的矩形子区域,其边不一定与区域边平行。
实现这一目标的最佳方法是什么?
我现在在做什么:
UIView
(因此其框架为5000x5000)作为UIScrollView的子视图。计算并应用CGAffineTransform
- 旋转视图,使区域边与坐标轴平行,并将所需区域定位到原点:
contentView.transform = CGAffineTransformMake(cos(angle), sin(angle), -sin(angle), cos(angle), -requiredRect.origin.x, -requiredRect.origin.y);
将scrollview的内容大小设置为所需的值。
scrollView.contentSize = CGSizeMake(someWidth, someHeight);
它在某种程度上起作用,但它有一些(事实并非全部列出)问题:
scrollViewDidEndZooming
方法中再次设置它,但无论如何它看起来都很奇怪。您能否提出另一种解决问题的方法,或指出可以采取哪些措施来改善现有问题?当自定义转换应用于其内容视图时,UIScrollView
看起来行为很糟糕......
答案 0 :(得分:0)
虽然我对我的解决方案并不完全满意,但我想出了以下内容:在委托的-scrollViewDidScroll
方法中,我检查当前可见区域是否是我的有限区域的子区域。如果不是我在没有动画的情况下调整内容偏移量,以使可见区域符合限制。
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView{
if (!CGRectContainsRect(myLimitRect, [aScrollView visibleRect]){
// calculate new contents offset to make visible region fit limits
[aScrollView setContentOffset:newContentOffset animated:NO};
}
}
这样做我不需要将复杂的CGAffineTransforms显式地应用到我的内容视图中(不需要缩放/转换视图) - 我只需要旋转它,看起来UIScrollView可以很好地处理它。