多种触摸手势一直是iPhone使用体验必不可少的一部分,然而双指捏合和点击技术已成为历史。去年,iPhone 6S引入了一项全新的3D Touch多点触摸体验。支持3D Touch的显示器能够感知到用户触摸屏幕的力度。由于采用了这项技术,在其他内容中,iOS获得了新的Peek and Pop体验,让使用者可以预览Safari中的内容。我非常高兴的宣布一些 WKWebView开发者可以使用的更新。
WebKit支持 Peek and Pop作为预览链接的最简单的方式。使用iOS 10 SDK开发的App默认开启了Peek and Pop链接预览,但这并不是一个新特性;从iOS 9开始,在支持3D Touch的设备中使用WKWebView的allowLinkPreview属性,WKWebView客户端就可以选择基于Peek的链接预览。当allowLinkPreview属性设为true时,使用者可以轻轻的按下链接来查看,然后在app上的另一个视图里加载链接,同时app在背景中模糊显示。
如果使用者用力按下链接,链接会在Safari中弹出。
这种变化非常适合类似邮件这样的应用程序。邮件中使用WebKit来显示大量的HTML内容,但它不是一个网页浏览器,因此连接导航总是交给Safari。然而,许多WebKit应用程序处理链接导航及表现更像自带了浏览器。在iOS 10 中我们让Peek和Pop在这些类型的应用上表现更好。
关于WKPedia的设想。Anders和我开发了WKPedia,一个的维基百科的浏览器应用程序,作为在iOS 8中WKWebView 的示例应用程序。WKPedia 有一个WKNavigationDelegate,强制导航策略,以便于当用户点击访问其他维基百科页面的链接时交给WKPedia应用程序中的导航处理,但是如果用户点击任何其他托管域名的链接时,WKPedia将导航交给Safari处理。
我设置allowedLinkPreview为true是为了可以启动Peek和Pop,但这个默认行为在这个应用程序中效果并不理想。现在如果一个用户点击一个链接,WKPedia使用加载策略来决定是否导航到应用程序内部链接还是将其交给Safari来处理。但是如果她读取并弹出这个链接,那么无论加载策略如何,弹出项将总是导航到Safari中的链接。
如果你有像WKPedia这样的应用程序,并寻求能提供更好的用户体验,你可以开始使用我们在iOS 10里面添加的新的API!在新的API中,只要用户在WKWebView中使用3D Touch查看和弹出链接就可以显示自定义视图控制器。这个API是由WKUIDelegate协议中的三个委托方法组成。
optional func webView(_ webView: WKWebView, shouldPreviewElement elementInfo: WKPreviewElementInfo) -> Bool optional func webView(_ webView: WKWebView, previewingViewControllerForElement elementInfo: WKPreviewElementInfo, defaultActions previewActions: [WKPreviewActionItem]) -> UIViewController? optional func webView(_ webView: WKWebView, commitPreviewingViewController previewingViewController: UIViewController)
第一个方法,当用户触摸元素时webView(_:shouldPreviewElement:)立即被调用。返回false将完全禁用该元素的预览,并且阻止其他方法的调用。返回true将提供一个自定义视图控制的机会,前提是用户触摸时有足够的力度来启动查看。
如果用户输入Peek,那么webView(_:previewingViewControllerForElement:defaultActions:)为其提供了一个定制视图控制器的机会。返回任何非空视图控制器都会导致视图控制器显示为Peek预览。defaultActions参数是一个活动数组,WebKit Webkit默认使用它作为previewActionItems。如果想要使用这些活动中的任何一个,你只需从视图控制器的previewActionItems执行结果中返回即可。这里是WKPedia中这个委托方法的实现情况:
func webView(_ webView: WKWebView, previewingViewControllerForElement elementInfo: WKPreviewElementInfo, defaultActions previewActions: [WKPreviewActionItem]) -> UIViewController? { // If this URL is not allowed by our navigation policy, then it must not be a link // to a page on Wikipedia, so returning nil will let WebKit display its default // preview which will pop to Safari. if !navigationAllowedForURL(elementInfo.linkURL) { return nil; } let previewViewController = ArticlePreviewController() previewViewController.view.frame = self.view.frame previewViewController.view.backgroundColor = UIColor.white() var actions = [WKPreviewActionItem]() for previewAction in previewActions { if previewAction.identifier == WKPreviewActionItemIdentifierShare { actions.append(previewAction) } } previewViewController.defaultPreviewActionItems = actions previewViewController.load(request: URLRequest(url:elementInfo.linkURL)) return previewViewController}
最后,如果用户用足够的力触摸来弹出视图控制器,webView(_:commitPreviewingViewController:)将被调用。此时,你可以选择在app中展示弹出的视图控制器。
这个API为开发者提供了对Peek and Pop的控制来达到更好的用户体验。我期待在更多app中见到它!
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务