【问题标题】:WKWebView zooming not working properlyWKWebView 缩放无法正常工作
【发布时间】:2017-11-28 06:35:23
【问题描述】:

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

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

我的ViewController.h 中的UIScrollViewDelegate 协议如下:

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

我在viewDidLoad 中将代理设置为self,如下所示:

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 或容器视图被缩放(我猜),而是在后续缩放手势上缩放。

经过一番观察,我发现滚动视图索引 0 处的子视图第一次和后续时间都被缩放(但内容页面不是第一次缩放后续时间),它在 @ 返回987654332@。应该是这样,&是。我通过将标签值分配给每个视图并通过在日志区域的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 

我不知道我错过了什么。

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

【问题讨论】:

    标签: ios objective-c zooming wkwebview xwalkview


    【解决方案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;
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多