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;
}
isFirstTimeZooming
在 didStartProvisionalNavigation
方法中加载页面时设置为 YES,在 scrollViewDidEndZooming
方法中设置为 NO 以便滚动视图的第一个子视图可以在随后的缩放中传递。
我不得不使用 isFirstTimeZooming
,因为如果我只在 viewForZoomingInScrollView
中传递最后一个子视图,缩放问题就会被逆转,即它第一次正确缩放,但在随后的缩放中不正确。
我正在使用 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;
}
isFirstTimeZooming
在 didStartProvisionalNavigation
方法中加载页面时设置为 YES,在 scrollViewDidEndZooming
方法中设置为 NO 以便滚动视图的第一个子视图可以在随后的缩放中传递。
我不得不使用 isFirstTimeZooming
,因为如果我只在 viewForZoomingInScrollView
中传递最后一个子视图,缩放问题就会被逆转,即它第一次正确缩放,但在随后的缩放中不正确。