1

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 座標を変更する必要があります。ただし、これまでに試したことはすべて失敗しました。

4

2 に答える 2

10

iOS dev フォーラムでユーザー Brian2012 から次の回答を受け取りました。

私がしたこと:

  1. ビュー コントローラーのメイン ビューをカバーする UIScrollView を作成しました。
  2. スクロール ビューにデスクトップ ビュー (標準の UIView) を配置します。デスクトップの原点は 0,0 で、サイズはスクロール ビューよりも大きいため、最初にズームしなくてもスクロールできました。
  3. いくつかのウィジェット ビュー (UIImageView) をデスクトップ ビューのさまざまな場所に配置します。
  4. スクロール ビューの contentSize をデスクトップ ビューのサイズに設定します。
  5. スクロールするビューとしてデスクトップ ビューを返すように、viewForZoomingInScrollView を実装しました。
  6. NSLogs を scrollViewDidZoom に入れて、デスクトップ ビューのフレームとウィジェット ビューの 1 つを出力します。

私が見つけたもの:

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

結論:

ビュー コントローラーのメイン ビューの座標系に対するウィジェットの位置を特定するには、自分で計算する必要があります。この場合、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 );
}
于 2012-05-07T13:15:55.560 に答える