3D Touch介绍:电子秤App与快捷操作
随着 iPhone6s 与 6s plus 的到来,苹果给我们展现了一种全新的交互方式:重按手势。你可能知道,这个特性已经在 Apple Watch 和 MacBook 上推出了,不过那时叫 Force Touch,就是字面上的意思,给用户的交互添加一种新的维度。 如果你很好奇 iPhone 的 Force Touch 为啥要更名为 3D Touch,那告诉你吧,you're not alone(译者注:请用 MJ 的调子唱出来…)。不久前,之前也对这名字纠结不已的 Craig Federighi(译者注:Apple 高级副总裁)介绍了这个新特性,第一条微博就这样产生了。也不知道 Force Touch 这名字有啥不好的,就因为有太多星球大战的梗?(译者注:其实我不知道这梗...)(校对注:译者是个妹子)(定稿注:还是单身) 但是,Force Touch 和 3d Touch 确实不一样!Force Touch 只能识别重按。这方面 3D Touch 要灵敏多了,它能够识别按压的力度。
虽然说,这点不同看起来无足轻重,但是这使开发者能开发更多精确计量方面的 App。比如这一款名为Gravity的应用,它利用 Force Touch 让你的 iPhone 成为了一个电子秤。虽然这款 App 被 Apple 拒了,但是这创意简直太棒了。为了展示 3D Touch 的工作流程,我们来做一个简单的 App。 先去下载这个初始案例。初始案例中只有一个空的 Single View。我在里面创建了 App 必要的 UI 元素(
这个 App 的设计很简单:ViewController 上有两个 Label:一个标题和一个显示按压百分比的文本。 那...开始写代码吧!在 iPhone6s 和 6s Plus 上, 无论什么情况,当用户触摸屏幕时, override func touchesMoved(touches: Set<UITouch>,withEvent event: UIEvent?) { if let touch = touches.first { if #available(iOS 9.0,*) { if traitCollection.forceTouchCapability == UIForceTouchCapability.Available { // 3D Touch capable } } } } 在这个 除此之外,我还使用了 要得到按压百分比?那太简单了,只需要用 override func touchesMoved(touches: Set<UITouch>,*) { if traitCollection.forceTouchCapability == UIForceTouchCapability.Available { // 3D Touch capable let force = touch.force/touch.maximumPossibleForce forceLabel.text = "(force)% force" } } } } 如果你在 iPhone6s/6s Plus 上跑这个程序,按屏幕时就能看到压力百分比了。但是,其实我们更想知道放在 iPhone 上物体的重量,而不是百分比。根据Ryan McLeod的 App 可以知道,传感器的计量范围的最大值是 385g。因此, 到此, override func touchesMoved(touches: Set<UITouch>,withEvent event: UIEvent?) { if let touch = touches.first { if #available(iOS 9.0,*) { if traitCollection.forceTouchCapability == UIForceTouchCapability.Available { if touch.force >= touch.maximumPossibleForce { forceLabel.text = "385+ grams" } else { let force = touch.force/touch.maximumPossibleForce let grams = force * 385 let roundGrams = Int(grams) forceLabel.text = "(roundGrams) grams" } } } } } 然后...你就有了一个电子秤 App...
还有一个小问题:当物体或者触摸事件结束之后,文本没有重置。你可以实现 override func touchesEnded(touches: Set<UITouch>,withEvent event: UIEvent?) { forceLabel.text = "0 gram" } 主屏幕上的快捷操作另一个 3D Touch 的用法是主屏幕上的快捷操作。快捷操作可以让用户从快捷方式直接跳转到 App 的某个地方。按压 App icon 快捷方式就会出现。在介绍 3D Touch 的时候,Twitter、Instagram 等 App 就展示了这个新特性。
让我们来给刚才的电子秤 App 添加一个快捷操作吧(把白色背景换成蓝色)。要添加快捷操作,先打开工程目录中的
在这个数组中,我们将会给自定义的快捷操作添加 4 个配置。然后,你的
最后一件事,就是实现用户触发快捷操作的处理流程。快捷方式需要在 func application(application: UIApplication,performActionForShortcutItem shortcutItem: UIApplicationShortcutItem,completionHandler: (Bool) -> Void) { // Handle quick actions completionHandler(handleQuickAction(shortcutItem)) } 这个方法需要调用 enum Shortcut: String { case openBlue = "OpenBlue" } func handleQuickAction(shortcutItem: UIApplicationShortcutItem) -> Bool { var quickActionHandled = false let type = shortcutItem.type.componentsSeparatedByString(".").last! if let shortcutType = Shortcut.init(rawValue: type) { switch shortcutType { case .openBlue: self.window?.backgroundColor = UIColor(red: 151.0/255.0,green: 187.0/255.0,blue: 255.0/255.0,alpha: 1.0) quickActionHandled = true } } return quickActionHandled } 一切都是这么简单。现在把程序跑起来,使用快捷操作来启动 App,就可以看到背景已经是蓝色了。
还有一件事还有一个问题你别忘了...在程序启动顺序方面,启动程序和使用快捷操作唤醒是有区别的。我们都知道,程序启动会调用
如果你回头看 func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. self.window?.backgroundColor = UIColor.whiteColor() return true } 问题来了:当使用快捷操作唤醒程序时, 要解决这个问题,我们需要在 func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { print("didFinishLaunchingWithOptions called") var isLaunchedFromQuickAction = false // Check if it's launched from Quick Action if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { isLaunchedFromQuickAction = true // Handle the sortcutItem handleQuickAction(shortcutItem) } else { self.window?.backgroundColor = UIColor.whiteColor() } // Return false if the app was launched from a shortcut,so performAction... will not be called. return !isLaunchedFromQuickAction } 通过判断可选值的 因为我们已经在 再次运行程序!完美! 最后3D Touch 是给程序添加另一种交互方式的好方法。但是你还是不要忘了,目前还不是所有设备都支持 3D Touch。 通过这篇文章,你应该能给你的 App 添加快捷操作,也能计量按压力度了。 顺便,你可以在这里下载程序的最终版。同样,欢迎大家留言。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |