2012-05-04 16 views
1

私はUIScrollView内でUIViewの変換されたCGRectを取得しようとしています。私がズームしていないとうまく動作しますが、一度ズームすると、新しいCGRectがシフトします。ここでは近い私を得ているコードは次のとおりです。ConvertRectはUIScrollViewのズームとcontentOffsetを会計処理します

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座標を変更する必要があります。私がこれまで試みてきたことはすべて成功しなかった。

答えて

9

私は、iOS用のdevのフォーラムで、ユーザーBrian2012から以下の回答を受けた:

私がやったこと

  1. は、View ControllerのメインビューをカバーUIScrollViewのを作成しました。
  2. デスクトップビュー(標準のUIView)をスクロールビューに配置します。デスクトップの起点は0,0で、サイズはスクロールビューよりも大きいので、最初にズームすることなくスクロールすることができます。
  3. いくつかのウィジェットビュー(UIImageView)をさまざまな場所のデスクトップビューに配置します。
  4. スクロールビューのcontentSizeをデスクトップビューのサイズに設定します。
  5. viewForZoomingInScrollViewを実装して、デスクトップビューをスクロールするビューとして戻します。
  6. scrollViewDidZoomにNSLogを入れて、デスクトップビューのフレームとウィジェットビューの1つを印刷します。私が見つけた何

  1. ウィジェットフレームは、私が設定した初期値から変更することはありません。たとえば、ウィジェットが位置108,108でサイズ64x64で開始した場合、ズームやスクロールに関係なく、フレームは常に108,108,64,64としてレポートされます。
  2. デスクトップフレームの原点は変更されません。私は、デスクトップの起点を0,0のスクロールビューに置き、ズームやスクロールに関係なく、起点は常に0,0として報告されます。
  3. 変更するのはデスクトップビューのフレームサイズだけで、サイズは元のサイズにスクロールビューのzoomScaleを掛けたものにすぎません。

結論:

View Controllerのメインビューの座標系にウィジェットの位置を把握するためには、数学を自分で行う必要があります。 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); 
} 
+2

私はUIScrollViewのズームのときにUIScrollViewのsubViewの座標系について非常に混乱しています。いくつかのドキュメントがこれを完全に説明していますか? – Yeung

関連する問題