スクロールビューで中心にズームするには?

center ios point scrollview zooming
スクロールビューで中心にズームするには?

以前はズームするためにタップを実装していましたが、現在表示されているものの中心にズームインするアイコンを代わりに使用することにしました。ズームするためにタップに使用したコードを再利用したいと思います同じ効果ですが、何を中心点として渡すかわかりません。

を使用しています

(CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center

タップズームに使用したジェスチャレコグナイザーからの中心点を受け入れるメソッド。ただし、ジェスチャレコグナイザーを使用しなくなったため、どのcgpointを渡すかを把握する必要があります。 また、この方法はタップズームでも機能したので、これが問題を抱えているとは思いません。

やってみた

    centerPoint = [scrollView contentOffset];
    centerPoint.x += [scrollView frame].size.width / 2;
    centerPoint.y += [scrollView frame].size.height / 2;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:centerPoint];

現在の中心を計算し、それをzoomRectForScaleに渡す必要がありますが、機能しません(中心の右側にズームします)。

この問題はおそらく、ズームが適用される前に画像の中心を通過している可能性があり、おそらくスケーリングされた中心を通過していることに関係していると思われます。 誰もがこれについての経験がありますか、またはどのように中心を計算するべきかについてのアイデアがありますか?

  2  3


ベストアンサー

私たちはそれを機能させ、私たちがやったことを投稿すると思いました

 /**
 Function for the scrollview to be able to zoom out
 **/

-(IBAction)zoomOut {

    float newScale = [scrollView zoomScale] / ZOOM_STEP;
    [self handleZoomWith:newScale andZoomType: FALSE];
}

/**
 Function for the scrollview to be able to zoom in
 **/

-(IBAction)zoomIn {

    float newScale = [scrollView zoomScale] * ZOOM_STEP;
    [self handleZoomWith:newScale andZoomType: TRUE];
}

-(void)handleZoomWith: (float) newScale andZoomType:(BOOL) isZoomIn {

    CGPoint newOrigin = [zoomHandler getNewOriginFromViewLocation: [scrollView contentOffset]
                                                         viewSize: scrSize andZoomType: isZoomIn];
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:newOrigin];
    [scrollView zoomToRect:zoomRect animated:YES];
}

そして、zoomHandlerクラスにこれがありました

-(CGPoint) getNewOriginFromViewLocation: (CGPoint) oldOrigin
                               viewSize: (CGPoint) viewSize
                            andZoomType:(BOOL) isZoomIn {

    /* calculate original center (add the half of the width/height of the screen) */
    float oldCenterX = oldOrigin.x + (viewSize.x / 2);
    float oldCenterY = oldOrigin.y + (viewSize.y / 2);

    /* calculate the new center */
    CGPoint newCenter;
    if(isZoomIn) {
        newCenter = CGPointMake(oldCenterX * zoomLevel, oldCenterY * zoomLevel);
    } else {
        newCenter = CGPointMake(oldCenterX / zoomLevel, oldCenterY / zoomLevel);
    }

    /* calculate the new origin (deduct the half of the width/height of the screen) */
    float newOriginX = newCenter.x - (viewSize.x / 2);
    float newOriginY = newCenter.y - (viewSize.y / 2);

    return CGPointMake(newOriginX, newOriginY);
}

1


タイトルとURLをコピーしました