如何使用scrollview缩放到中心?

时间:2011-04-27 16:11:45

标签: ios center scrollview point zooming

我们之前已经实现了点击缩放功能,现在我们决定使用图标来放大当前正在显示的中心,我们希望重复使用我们用于点击缩放的代码。我们想要相同的效果,但现在我们不知道要作为中心点传递什么。

我们正在使用

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

用于从我们用于点按缩放的手势识别器接受中心cgpoint的方法;但是,由于我们不再使用手势识别器,我们将不得不弄清楚传递它的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,但是它不起作用(它缩放到中心的右侧)。

我认为这个问题可能与我们在应用缩放之前传递图像中心的事实有关,也许我们应该通过一个缩放的中心。有没有人对此有任何经验,或对我们如何计算中心有任何想法?

1 个答案:

答案 0 :(得分:1)

我们得到了它的工作,我以为我会发布我们最终做的事情

 /**
 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);
}