ConvertRect计算UIScrollView zoom和contentOffset

时间:2012-05-04 19:22:25

标签: objective-c ios xcode ios5

我一直在尝试在UIScrollView中获取UIView的转换后的CGRect。如果我没有放大,它可以正常工作,但一旦我缩放,新的CGRect就会移动。这是让我接近的代码:

CGFloat zoomScale = (scrollView.zoomScale);    
CGRect newRect = [self.view convertRect:widgetView.frame fromView:scrollView];
CGPoint newPoint = [self.view convertPoint:widgetView.center fromView:scrollView];

//  Increase the size of the CGRect by multiplying by the zoomScale
CGSize newSize = CGSizeMake(newRect.size.width * zoomScale, newRect.size.height * zoomScale);
//  Subtract the offset of the UIScrollView for proper positioning
CGPoint newCenter = CGPointMake(newPoint.x - scrollView.contentOffset.x, newPoint.y - scrollView.contentOffset.y);

//  Create rect with the proper width/height (x and y set by center)
newRect = CGRectMake(0, 0, newSize.width, newSize.height);    

[self.view addSubview:widgetView];

widgetView.frame = newRect;
widgetView.center = newCenter;

我很确定我的问题在于zoomScale - 我应该根据zoomScale值修改x和y坐标。到目前为止,我所尝试的一切都没有成功。

1 个答案:

答案 0 :(得分:10)

我在iOS开发论坛上收到了用户Brian2012的以下回答:

我做了什么:

  1. 创建了一个覆盖视图控制器主视图的UIScrollView。
  2. 在滚动视图中放置桌面视图(标准UIView)。桌面的原点是0,0,大小比滚动视图大,所以我可以滚动而不必先进行缩放。
  3. 将一些小部件视图(UIImageView)放入各个位置的桌面视图中。
  4. 将滚动视图的contentSize设置为桌面视图的大小。
  5. 实现了viewForZoomingInScrollView以返回桌面视图作为要滚动的视图。
  6. 将NSLogs放在scrollViewDidZoom中以打印出桌面视图的框架和其中一个小部件视图。
  7. 我发现了什么:

    1. 小部件框架永远不会更改我设置的初始值。因此,例如,如果窗口小部件从位置108,108开始,大小为64x64,则无论缩放或滚动,帧总是报告为108,108,64,64。
    2. 桌面框架原点永远不会改变。我在滚动视图中将桌面原点设置为0,0,无论缩放或滚动,原点始终都会报告为0,0。
    3. 唯一改变的是桌面视图的帧大小,大小只是原始大小乘以滚动视图的zoomScale。
    4. 结论:

      要确定窗口小部件相对于视图控制器主视图坐标系的位置,您需要自己进行数学运算。在这种情况下,convertRect方法没有做任何有用的事情。这是一些尝试的代码

      - (CGRect)computePositionForWidget:(UIView *)widgetView fromView:(UIScrollView *)scrollView
      {
          CGRect frame;
          float  scale;
      
          scale = scrollView.zoomScale;
      
          // compute the widget size based on the zoom scale
          frame.size.width  = widgetView.frame.size.width  * scale;
          frame.size.height = widgetView.frame.size.height * scale;
      
          // compute the widget position based on the zoom scale and contentOffset
          frame.origin.x = widgetView.frame.origin.x * scale - scrollView.contentOffset.x + scrollView.frame.origin.x;
          frame.origin.y = widgetView.frame.origin.y * scale - scrollView.contentOffset.y + scrollView.frame.origin.y;
      
          // return the widget coordinates in the coordinate system of the view that contains the scroll view
          return( frame );
      }