在UIScrollView中显示UIView的子区域

时间:2010-03-17 12:10:44

标签: iphone uiscrollview

在我的应用程序中,我有大面积(≈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);
    

它在某种程度上起作用,但它有一些(事实并非全部列出)问题:

  • 当我缩放滚动视图时,其内容大小会重置为我的大区域视图的大小(5000x5000乘以比例因子)。我在委托的scrollViewDidEndZooming方法中再次设置它,但无论如何它看起来都很奇怪。
  • 缩放似乎应用了不正确的锚点并且看起来不太好(在缩放完成后查看“跳转”到另一个位置)

您能否提出另一种解决问题的方法,或指出可以采取哪些措施来改善现有问题?当自定义转换应用于其内容视图时,UIScrollView看起来行为很糟糕......

1 个答案:

答案 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可以很好地处理它。