【发布时间】:2017-04-12 10:26:09
【问题描述】:
有没有办法在 webview 上禁用交互? 这样用户就不能比加载的 webview 更进一步?
编辑: 禁用 UserInteractions 不是解决方案,因为网站仍然必须是可滚动的。
【问题讨论】:
-
可以实现webview的委托方法。
标签: ios objective-c wkwebview
有没有办法在 webview 上禁用交互? 这样用户就不能比加载的 webview 更进一步?
编辑: 禁用 UserInteractions 不是解决方案,因为网站仍然必须是可滚动的。
【问题讨论】:
标签: ios objective-c wkwebview
实现WKNavigationDelegate 协议:
@interface ViewController () <WKNavigationDelegate>
设置您的WKWebView 的navigationDelegate 属性:
self.wkWebView.navigationDelegate = self;
然后为您要限制的 URL 实施策略:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if ([navigationAction.request.URL.absoluteString containsString:@"somedomain.com/url/here"]) {
decisionHandler(WKNavigationActionPolicyAllow);
}
else {
decisionHandler(WKNavigationActionPolicyCancel);
}
}
【讨论】:
WKNavigationDelegate 解决方案只会阻止用户点击链接。我也有我想阻止交互的表单控件,同时仍然允许滚动页面。最终我发现这可以通过禁用 web 视图的滚动视图的子视图来实现:
斯威夫特
self.webView.scrollView.subviews.forEach { $0.isUserInteractionEnabled = false }
Objective-C
for (UIView *subview in self.webView.scrollView.subviews)
{
subview.userInteractionEnabled = NO;
}
【讨论】:
Value of type 'WKWebView' has no member 'scrollView'
WKWebView 的类型?也许是一些 Xcode 问题,可以通过重新启动来解决?
首先,您必须将代理交给您的 webkit,然后添加以下代码。 斯威夫特 5.0
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
Activity.stopAnimating()
let javascriptStyle = "var css = '*{-webkit-touch-callout:none;-webkit-user-select:none}'; var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(css)); head.appendChild(style);"
webView.evaluateJavaScript(javascriptStyle, completionHandler: nil)
}
这段代码将做什么,我们以编程方式添加 css 将禁用 webview 中的交互
【讨论】:
这些 javascript 行将通过覆盖 HTML 来禁用长按和链接触摸。嵌入的 youtube 视频等基于帧的内容仍然可以使用。
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none'")
webView.evaluateJavaScript("document.documentElement.style.webkitTouchCallout='none'")
webView.evaluateJavaScript("var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { elems[i]['href'] = 'javascript:(void)'; }")
}
【讨论】:
您可以按照以下方式进行。
//-----------------------------------------------------------------------
#pragma mark - UIWebView Methods
//-----------------------------------------------------------------------
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
return YES;
}
//----------------------------------------------------------------
- (void)webViewDidStartLoad:(UIWebView *)webView {
//disable user interaction
}
//----------------------------------------------------------------
- (void)webViewDidFinishLoad:(UIWebView *)webView{
//enable user interaction
}
//----------------------------------------------------------------
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
//enable user interaction
}
【讨论】: