Масштабирование 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 и устанавливаю его YES или NO на основе URL-адреса в зависимости от того, требуется ли масштабирование или нет. На страницах, где требуется масштабирование, я вижу журнал блока else (NSLog(@"viewForZoomingInScrollView NO");), который печатается в области журнала, а на страницах, где масштабирование не требуется, я вижу журнал блока if (NSLog(@"viewForZoomingInScrollView YES");). Который работает. Единственная проблема заключается в том, что страница содержимого не масштабируется при первом жесте масштабирования, вместо этого масштабируется WKWebView или представление контейнера (я думаю), но масштабируется при последующих жестах масштабирования.

После некоторого наблюдения я обнаружил, что подпредставление с индексом 0 в прокрутке масштабируется в первый и последующие разы (но страница содержимого масштабируется в последующие разы, а не в первый раз), что возвращается в 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 

Я не знаю, что мне не хватает.

Пожалуйста, прокомментируйте, если необходимы какие-либо разъяснения.


person Osama Mohammed Shaikh    schedule 28.11.2017    source источник


Ответы (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, чтобы первое подвид прокрутки можно было передать при последующем масштабировании.

Мне пришлось использовать isFirstTimeZooming, потому что, если я пройду последний подвид только в viewForZoomingInScrollView, проблема масштабирования будет изменена, т.е. масштабирование будет правильно в первый раз, но не при последующих масштабированиях.

person Osama Mohammed Shaikh    schedule 29.11.2017