Проблема
У меня в приложении для iPad есть UIWebView, который мне нужно масштабировать программно, но без использования жестов / касаний. Приложение. имеет кнопки «+» и «-» для увеличения и уменьшения масштаба с шагом, определяемым пользователем (это приложение для слабовидящих).
Эта функция +/- кнопка масштабирования ранее работала на 100% нормально, когда мое приложение. использовал UIImageView внутри UIScrollView (вместо WebView). ImageView был фактическим видом, который был увеличен, а CenterPoint был рассчитан для метода ScrollView zoomToRect.
Теперь у меня есть WebView, который, как я знаю, содержит ScrollView в качестве подпредставления. Я попытался адаптировать код, который ранее работал с комбинированным изображением ImageView / ScrollView, чтобы вместо этого увеличить масштаб ScrollView WebView, , но он больше не вычисляет правильную точку CenterPoint для zoomToRect: .
Что происходит:
WebView правильно масштабирует с точки зрения уровня масштабирования, но центральная точка всегда неверна. По какой-то причине экран всегда увеличивается слева вверху каждый раз.
Еще одна странная проблема заключается в том, что после самого первого увеличения масштаба вы не можете прокручивать WebView за видимой частью экрана. Если вы попытаетесь это сделать, он покажет немного контента, выходящего за границы видимой в данный момент области, но он мгновенно возвращается назад.
Что я пробовал:
Я пытаюсь увеличить ScrollView в UIWebView.
Я создаю указатель на ScrollView и устанавливаю «self» в качестве его делегата. Затем я настраиваю различные переменные, такие как scrSize (размер представления для увеличения) и ZoomHandler (поясняется ниже):
- (void)viewDidLoad {
// ... Various UIWebView setup ...
[self LoadURL];
// Zooming & scrollview setup
zoomHandler = [[ZoomHandler alloc] initWithZoomLevel: ZOOM_STEP];
scrSize = CGPointMake(self.WebView.frame.size.width, self.WebView.frame.size.height);
scrollView = [WebView.subviews objectAtIndex:0];
[scrollView setTag:ZOOM_VIEW_TAG];
[scrollView setMinimumZoomScale:MINIMUM_SCALE];
[scrollView setZoomScale:1];
[scrollView setMaximumZoomScale:10];
scrollView.bounces = FALSE;
scrollView.bouncesZoom = FALSE;
scrollView.clipsToBounds = NO;
[scrollView setDelegate:self];
[super viewDidLoad];
}
Чтобы переопределить ограничения масштабирования по умолчанию в WebView, я вставляю этот Javascript в загруженную веб-страницу в webViewDidFinishLoad: метод:
function increaseMaxZoomFactor() {
var element = document.createElement('meta');
element.name = "viewport";
element.content = "maximum-scale=10 minimum-scale=1 initial-scale=1 user-scalable=yes width=device-width height=device-height;"
var head = document.getElementsByTagName('head')[0];
head.appendChild(element);
}
Код CenterPoint:
Этот код используется для вычисления CenterPoint для передачи в zoomToRect :. Это работало на 100% нормально, когда я масштабировал ImageView внутри ScrollView.
-(IBAction)zoomOut {
float newScale = [scrollView zoomScale] / ZOOM_STEP;
if( [scrollView zoomScale] > MINIMUM_SCALE) {
[self handleZoomWith:newScale andZoomType: FALSE];
}
}
-(IBAction)zoomIn {
float newScale = [scrollView zoomScale] * ZOOM_STEP;
if( [scrollView zoomScale] < MAXIMUM_SCALE){
[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];
}
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {
CGRect zoomRect;
// At a zoom scale of 1.0, it would be the size of the scrollView's bounds.
// As the zoom scale decreases, so more content is visible, the size of the rect grows.
zoomRect.size.height = [WebView frame].size.height / scale;
zoomRect.size.width = [WebView frame].size.width / scale;
// Choose an origin so as to get the right center.
zoomRect.origin.x = center.x / scale;
zoomRect.origin.y = center.y / scale;
return zoomRect;
}
/**
Determine the origin [THIS IS INSIDE 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);
// Xalculate 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);
}
Кто-нибудь знает, почему CenterPoint не рассчитывается правильно? Любая помощь будет с благодарностью; Я застрял на этом неделю.
Спасибо,
Alex