Увеличаването на 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 

Не знам какво пропускам.

Моля, коментирайте, ако е необходимо някакво пояснение.


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


Отговори (1)


Разбрах решението! Връщането на последния подизглед за първи път и първия подизглед на scrollview при последващи увеличения в 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 е зададено на ДА при зареждане на страницата в метода didStartProvisionalNavigation и зададено на НЕ в метода scrollViewDidEndZooming, така че първият подизглед на scrollview да може да бъде предаден при последващо мащабиране.

Трябваше да използвам isFirstTimeZooming, защото ако премина последния подизглед само в viewForZoomingInScrollView, проблемът с мащабирането беше обърнат, т.е. мащабирането беше правилно първия път, но не и при следващите мащаби.

person Osama Mohammed Shaikh    schedule 29.11.2017