- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
当用户长按链接时,会出现带有以下选项的警报 Controller :
目前有两个问题:
如果用户在 WKWebView 完成导航之前执行长按,则会出现默认(Safari 的)警报 Controller 。
如果用户在弹出动画发生后抬起手指,WKWebView 会将其注册为点击并导航到该链接,同时警报 Controller 仍显示在屏幕上。
该机制分为三个部分。
首先,
在 WKWebView 完成导航后,javascript 将被注入(inject)禁用默认警报 Controller 的页面。
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
[_webView evaluateJavaScript:@"document.body.style.webkitTouchCallout='none';"
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
}];
}
其次,
UILongPressGestureRecognizer 被添加到 WKWebView 并实现,以便它根据触摸的位置找到元素的属性。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
- (void)longPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
if (longPressGestureRecognizer.state == UIGestureRecognizerStateBegan) {
_shouldCancelNavigation = YES;
CGPoint touchLocation = [longPressGestureRecognizer locationInView:_webView];
NSString *javascript = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Javascript" ofType:@"js"]
encoding:NSUTF8StringEncoding
error:nil];
[_webView evaluateJavaScript:javascript
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
}];
[_webView evaluateJavaScript:[NSString stringWithFormat:@"MyAppGetHTMLElementsAtPoint(%f,%f);", touchLocation.x, touchLocation.y]
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
NSString *tags = (NSString *)result;
if ([tags containsString:@",A,"]) {
[_webView evaluateJavaScript:[NSString stringWithFormat:@"MyAppGetHREFAttributeAtPoint(%f,%f);", touchLocation.x, touchLocation.y]
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
NSString *urlString = (NSString *)result;
[_delegate webView:self didLongPressAtTouchLocation:touchLocation URL:[NSURL URLWithString:urlString]];
}];
return;
}
if ([tags containsString:@",IMG,"]) {
[_webView evaluateJavaScript:[NSString stringWithFormat:@"MyAppGetSRCAttributeAtPoint(%f,%f);", touchLocation.x, touchLocation.y]
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
NSString *urlString = (NSString *)result;
[_delegate webView:self didLongPressAtTouchLocation:touchLocation imageWithSourceURL:[NSURL URLWithString:urlString]];
}];
return;
}
}];
}
}
最后,
呈现警报 Controller 的委托(delegate)方法在主 ViewController 上实现。
我对第二个问题的解决方案是添加一个 bool 值 shouldCancelNavigation,当警报 Controller 出现时它是 YES,当它被关闭时它是 NO。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
if (_shouldCancelNavigation) {
decisionHandler(WKNavigationActionPolicyCancel);
}
else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
有趣的是,网络上有许多链接不需要政策决定的例子。它们就这样发生了,我无法阻止它们。
来源:http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/comment-page-3/
来源 2:https://github.com/mozilla-mobile/firefox-ios/pull/61
编辑:
这解决了第二个问题,但我不确定它不会破坏其他地方。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
otherGestureRecognizer.enabled = NO;
otherGestureRecognizer.enabled = YES;
}
return YES;
}
编辑 2:
它确实产生了一个问题...您不能再选择文本,因为上面的代码重置了内部长按手势识别器。
编辑 3:
如果我完全删除我的实现(所有 3 个步骤)并让默认警报 Controller 在每次我长按链接时启动,第二个问题就解决了。
在您抬起手指后,Apple 的警报 Controller 会阻止 WKWebView 导航。
最佳答案
如果我没记错的话,在第二部分:
- (void)longPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
if (longPressGestureRecognizer.state == UIGestureRecognizerStateBegan) {
//Rest of your code ...
}
}
您正在注入(inject) javascript 以禁用系统对话框。现在在新闻结束后,WKWebview 已经收到从网络链接触发的事件。既然为时已晚,为什么不尝试检查 longPressGestureRecognizer.state
是否等于 UIGestureRecognizerStateEnded
的条件。
因此它更改为以下代码。
if (longPressGestureRecognizer.state == UIGestureRecognizerStateEnded) {
//Rest of your code ...
}
我还没有测试过这段代码。如果它有效,会更快乐。
关于javascript - WKWebView 自定义长按菜单可以工作,但有一些主要问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054003/
我遇到了死胡同。我只是想不出在用户关闭应用程序后恢复 WKWebView 的方法。当他重新打开它时,他访问过的所有网页都必须在那里。 有什么建议吗? 最佳答案 All the web pages he
有没有办法让 WKWebView 加载完整的 URL对于每个请求? webView:didFinishNavigation: 仅适用于 mainFrame导航并且不提供 URL 请求参数。 我如何获得
我想复制 Facebook 应用程序的行为,当您单击外部链接时,它会在新浏览器中打开(但它不在 Safari 中)。 我目前有一个加载我的网站的 WKWebView。我可以在点击事件中捕获用户并打开它
我正在尝试将所有加载的数据从一个 WKWebView 复制到一个新的 WKWebView 以便在新的 webView 加载时加载所有内容提出了。关于如何执行此操作或对此的最佳方法有何建议? 最佳答案
WKWebView 允许您通过 Safari 打开外部链接(与基本 url 不同的链接)。 但是,有时您想打开 WKWebView 本身内的所有链接. 例如,假设您有一个基本网址 "https://t
我已经发布了我使用的委托(delegate)方法,如果没有按钮操作事件,我如何使用 javascript 添加该事件。我如何在我的 View Controller 中使用功能主义者。 func web
我正在制作一个应用程序,用户可以在其中单击一个按钮以禁用所有 JavaScript 在下一个页面加载时(而不是重新启动应用程序才能生效)。我尝试了以下代码,但首选项没有保存。 JavaScript 在
我知道我们可以初始化一个 UIWebView 或 WKWebView 然后注入(inject) JavaScript 来获取 navigator.userAgent 的值,但是这需要初始化UIWebV
目标:网站加载完成后对WKWebView进行截图 采用的方法: 在 UIViewController 中定义了一个 WKWebView 变量 创建了一个名为 screen capture() 的扩展方
服务人员在 WKWebView 中可用在 iOS 11.3 测试版中,但似乎在 iOS 11.3 的最终 GM 版本中不可用。 有谁知道如何在 WKWebView 中重新启用 Service Work
我有 44 个 UIButtons,每个按钮都应该连接到带有本地 html 的 wkwebview 的 vc。 有没有办法在一个 vc 中实现所有 44 个按钮? 这是 wkwebview 示例 vc
我正在尝试在 App WebView 中实现“真正的”全屏,这意味着无论如何我都希望网页内容完全显示在屏幕下方。 这是我面临的当前情况,当将 WebView 构建到 superviews 边界时: 红
我正在尝试使用带有单个按钮的简单 WKWebView,单击该按钮后应通过 JavaScript 回调到 Swift。但是,我在 Xcode 控制台中看到以下日志,并且 View 加载了空的 WKWeb
我正在尝试使用带有单个按钮的简单 WKWebView,单击该按钮后应通过 JavaScript 回调到 Swift。但是,我在 Xcode 控制台中看到以下日志,并且 View 加载了空的 WKWeb
我正在使用一个 MacOS 应用程序,它需要使用 WKUserScript 功能将消息从网页发送回 MacOS 应用程序。我正在处理文章 https://medium.com/capital-one-
对于UIWebView,我们可以通过以下方式获取内容高度: [webView stringByEvaluatingJavaScriptFromString:@"document.body.offset
优化背景 众所周知,H5 的部分优势(开发快,迭代快,热更新)是很明显的,公司客户端的部分业务都是由 H5 来实现的,网络好的情况下体验也是很不错的 但是其实 H5 的体验是比原生
由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新控件 WKWebVie
下图中的这个“up up up up”是使用wkwebview加载的html字符串 webView?.loadHTMLString((currentLock?.text)!, baseURL: nil
我的应用程序有 1 个 ViewController,它加载一个使用 Auth0 处理登录的网络应用程序 url。在 iOS 13.3 中,webView 已停止在登录后加载其他页面。 但是,当我尝试
我是一名优秀的程序员,十分优秀!