#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);
}