首先,我希望通过本文能帮到大家,大家的方便就是我最好的回报!
iOS设备上对用户的体验始终都是日渐提升的,其中3DTouch和widget的体验也是重要的一环。这不,最近我们多人开发的项目中也要求去做这块。
首先,支持3DTouch的苹果设备默认会帮每个没有做这块的APP会生成一个自带分享功能,弹出的页面也是苹果系统自己控制的。我们想要做一个自定义的touch功能会覆盖系统的这个分享功能。那么,具体是怎么去一一实现我们自定义的效果呢。我接着和大家聊一聊。
iOS系统有个shortcutItems的属性,这个里面就是暴露出来给用户去添加自定义的touch样式的。我们仅需要控制每个UIApplicationShortcutItem的样式就好了。这个类有三个属性UIApplicationShortcutIcon,localizedTitle,localizedSubtitle。分别给这三个属性赋值就是对图片,标题,详情标题的赋值。如果某个值传空,则对应的地方也会空着,来表示,一般第三个属性传空来显示图片和标题就好了。
那么根据touch如何控制弹出APP相对应的页面呢,这里要用到APPDelegate中的一个方法来控制逻辑,这个方法就是application(_ application: performActionFor shortcutItem: , completionHandler: )
通过在这里面对着shortcutItem.type进行判断来分类处理相关逻辑。
做好如上操作,基本上3DTouch功能就可以用了。那么,紧接着我会为大家聊一下widget的实现
widget的实现其实相当于要构建一个子APP,过程就是在project中的capabilities中通过"+"号来添加一个叫"Today Extension"的项目,添加命名完了之后,需要让主APP与这个子APP相互关联,来达到偏好设置及写文件处理的共享。当然主APP中的方法在子APP中不能调用。那怎么去做这个APP组关联呢。同样是在capabilities中去设置,在APP Group中打开按钮,通过加号来添加这个组名,在子APP中同一位置将这些操作都对应上。以上这些步骤可视为widget的环境搭建
说完了搭建,更重要的一步就是如何具体实现了。widget上的页面显示是完全依赖于子APP上的界面(换句话来说就是这上面的界面)。默认创建的"Today Extension"会给出MainInterface.storyboard的xib文件。在这上面操作最好还是用到xib而不是纯代码。因为很可能会出现对应控件不显示的问题。然后按照你们的需求及样式来铺设相关的界面。如果要求网络传输请求,可以通过widget中extensionContext?.open(NSURL(string: url)! as URL, completionHandler: { (bool) in})这个方法来实现(注意这个方法中url参数需要带有主APP的url schemes)。completionHandler里面要写回调之后的操作,比如要渲染相关的UI,那么调用这个方法之后,我们如何能请求对应的接口呢。这时候需要在主APP上的APPDelegate中的一个方法func application(_ app: ,open url: ,options: )来实现。通过传输的url中带有某个前缀来判断是点了哪个按钮。然后根据URL后缀带有的参数来进行网络请求。请求完了会调用到之前的回调结果,我们在这个回调中写出对应的结果就OK了。
以上就是做3DTouch及widget中用到的思路及步骤,如果有疑问,欢迎来致微(death-god-xpc)
网友评论