2

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

问题是如何在执行缩放手势时使 WKWebView 的内容页面缩放。

我符合以下UIScrollViewDelegate协议ViewController.h

@interface ViewController : UIViewController<UIScrollViewDelegate, WKNavigationDelegate, WKUIDelegate>

我将委托设置为 self ,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,具体取决于是否需要缩放。在需要缩放的页面上,我可以看到NSLog(@"viewForZoomingInScrollView NO");在日志区域中打印的 else 块 ( ) 的日志以及在不需要缩放的页面上,我可以看到 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 

我不知道我错过了什么。

如果需要任何澄清,请发表评论。

4

1 回答 1

0

得到解决方案!在后续放大方法中第一次返回最后一个子视图和滚动视图的第一个子视图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方法中设置为 NOscrollViewDidEndZooming以便滚动视图的第一个子视图可以在后续缩放时传递。

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

于 2017-11-29T06:43:48.627 回答