WKWebView масштабирование не работает должным образом
Я использую XWalkView, который является подклассом WKWebView, добавленным как подпредставление к представлению контейнера программно. Я пытаюсь увеличить страницу содержимого WKWebView, но она не увеличивается в первый раз. WKWebView затем увеличивает масштаб страницы содержимого, т. Е. Когда я увеличиваю масштаб или делаю двойное нажатие, он масштабирует сам WKWebView или представление контейнера (мое предположение), и после этого повторное увеличение жестами снова увеличивает масштаб страницы содержимого (что является ожидаемым поведением).
Вопрос в том, как сделать так, чтобы страница содержимого WKWebView увеличивалась при каждом выполнении жеста увеличения.
Я соответствую UIScrollViewDelegate
протокол в моем ViewController.h
как показано ниже:
@interface ViewController : UIViewController<UIScrollViewDelegate, WKNavigationDelegate, WKUIDelegate>
Я устанавливаю делегата на себя в viewDidLoad
как показано ниже:
xWalkView.scrollView.delegate = self;
Настройка масштабирования в viewDidLoad
как показано ниже:
xWalkView.scrollView.minimumZoomScale = 1;
xWalkView.scrollView.maximumZoomScale = 6;
и реализации методов протокола в ViewController.m
как показано ниже:
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
if (shouldPageNotZoom) {
NSLog(@"viewForZoomingInScrollView YES");
return nil;
} else {
NSLog(@"viewForZoomingInScrollView NO");
return xWalkView.scrollView.subviews[0];
}
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
}
Я использую BOOL shouldPageNotZoom и устанавливаю его ДА или НЕТ на основе URL в зависимости от того, требуется ли увеличение или нет. На страницах, где требуется увеличение, я вижу журнал блока else (NSLog(@"viewForZoomingInScrollView NO");
) при печати в области журнала и на страницах, где увеличение не требуется, я вижу журнал блока if (NSLog(@"viewForZoomingInScrollView YES");
). Который работает. Единственная проблема заключается в том, что страница содержимого не масштабируется при первом жесте масштабирования, вместо этого масштабируется WKWebView или представление контейнера (я полагаю), но масштабируется при последующих жестах масштабирования.
После некоторого наблюдения я обнаружил, что подпредставление с индексом 0 scrollview масштабируется в первый и последующий раз (но страница контента увеличивается в последующие раз, а не в первый раз), что возвращается в viewForZoomingInScrollView
, Что должно быть, и есть. Я сделал это, присвоив значения тегов каждому представлению и увидев значение тега, зарегистрировав значение тега в scrollViewDidEndZooming
метод в области журнала, как показано ниже:
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
if (shouldPageNotZoom) {
NSLog(@"viewForZoomingInScrollView YES");
return nil;
} else {
NSLog(@"viewForZoomingInScrollView NO");
xWalkView.scrollView.tag = 20;
xWalkView.tag = 15;
xWalkView.scrollView.subviews[0].tag = 10;
_containerView.tag = 5;
return xWalkView.scrollView.subviews[0];
}
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
NSLog(@"tag %li", (long) view.tag);
}
Предоставление нижеследующего журнала:
2017-11-28 17:21:36.610753+0530 MyApp[4614:241659] tag 10 //Getting this 1st time of zooming
2017-11-28 17:21:59.369461+0530 MyApp[4614:241659] tag 10 //Getting this at subsequent zooms
Я не знаю, что мне не хватает.
Пожалуйста, прокомментируйте, если требуется какое-либо разъяснение.
1 ответ
Получил решение! Возврат последнего подпредставления в первый раз и первое подпредставление прокрутки в последующих масштабах в viewForZoomingInScrollView
Метод решил проблему, как показано ниже:
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
if (shouldPageNotZoom) {
NSLog(@"viewForZoomingInScrollView YES");
return nil;
} else {
NSLog(@"viewForZoomingInScrollView NO");
xWalkView.scrollView.tag = 20;
xWalkView.tag = 15;
xWalkView.scrollView.subviews[0].tag = 10;
_containerView.tag = 5;
if (isFirstTimeZooming) {
return xWalkView.scrollView.subviews[xWalkView.scrollView.subviews.count - 1];
} else {
return xWalkView.scrollView.subviews[0];
}
}
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
NSLog(@"tag %li", (long) view.tag);
isFirstTimeZooming = NO;
}
isFirstTimeZooming
устанавливается на YES при загрузке страницы в didStartProvisionalNavigation
метод и установить в NO в scrollViewDidEndZooming
метод, так что первое подпредставление scrollview может быть передано при последующем масштабировании.
Я должен был использовать isFirstTimeZooming
потому что, если я передам последнее подпредставление только в viewForZoomingInScrollView
проблема масштабирования была обращена вспять, то есть она корректно изменялась в первый раз, но не при последующих масштабах.