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 проблема масштабирования была обращена вспять, то есть она корректно изменялась в первый раз, но не при последующих масштабах.

Другие вопросы по тегам