WKWebView 缩放无法正常工作

WKWebView zooming not working properly

我正在使用 XWalkView,它是 WKWebView 的子类,以编程方式作为子视图添加到容器视图。我正在尝试缩放 WKWebView 的内容页面,但它不会第一次缩放。 WKWebView 随后缩放内容页面,即当我捏缩放或双击缩放时,它缩放 WKWebView 本身或容器视图(我的猜测)&之后,再次做缩放手势内容页面被缩放(这是预期的行为)。

问题是如何让WKWebView的内容页在每次缩放手势时缩放

我在 ViewController.h 中遵守 UIScrollViewDelegate 协议,如下所示:

@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 将其设置为 YES 或 NO,具体取决于是否需要缩放。在需要缩放的页面上,我可以看到 else 块 (NSLog(@"viewForZoomingInScrollView NO");) 的日志打印在日志区域;在不需要缩放的页面上,我可以看到 if 块 (NSLog(@"viewForZoomingInScrollView YES");) 的日志。哪个有效。唯一的问题是内容页面不会缩放第一个缩放手势而不是缩放 WKWebView 或容器视图(我猜),而是缩放后续缩放手势。

经过一些观察我发现 scrollview 的索引 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 

我不知道我错过了什么。

如果需要任何说明,请发表评论。

找到答案了!在viewForZoomingInScrollView方法中第一次返回最后一个子视图&后续放大时scrollview的第一个子视图解决了问题,如下所示:

-(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;
}

isFirstTimeZoomingdidStartProvisionalNavigation 方法中加载页面时设置为 YES,在 scrollViewDidEndZooming 方法中设置为 NO 以便滚动视图的第一个子视图可以在随后的缩放中传递。

我不得不使用 isFirstTimeZooming,因为如果我只在 viewForZoomingInScrollView 中传递最后一个子视图,缩放问题就会被逆转,即它第一次正确缩放,但在随后的缩放中不正确。