Как увеличить изображение до центра с помощью scrollview?

#ios #center #scrollview #point #zooming

#iOS #центр #scrollview #точка #масштабирование

Вопрос:

Ранее мы реализовали нажатие для увеличения, а теперь решили использовать вместо этого значки, которые будут увеличивать центр того, что отображается в данный момент, и мы хотели бы повторно использовать код, который у нас был для нашего нажатия для увеличения, поскольку мы хотим тот же эффект, но теперь мы не знаем, что передать в качестве центральной точки.

Мы используем

(CGRect)zoomRectForScale: (float) масштабирование с центром: (CGPoint)center

метод, который раньше принимал центральную cgpoint из средства распознавания жестов, которое мы использовали для масштабирования нажатием; однако, поскольку мы больше не используем средство распознавания жестов, нам придется выяснить, какую cgpoint передать. Кроме того, этот метод работал для tap zoom, поэтому я не думаю, что именно здесь у нас проблема.

Мы пытались сделать это

     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:

У нас получилось, и я подумал, что опубликую то, что мы в итоге сделали

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