介绍

通过iPhone 6s和6s Plus,Apple引入了一种与我们的设备进行交互的全新方式,称为3D Touch。 3D Touch通过检测要施加到手机屏幕上的压力量来执行不同的操作。 在本教程中,我将向您展示如何利用3D Touch,以便您可以在自己的iOS 9应用中利用这项新技术。

先决条件

本教程要求您正在运行Xcode 7.1或更高版本。 在撰写本文时,iOS Simulator尚不支持3D Touch,这意味着任何测试都需要在物理设备,iPhone 6s或iPhone 6s Plus上进行。 如果您想继续,请先从GitHub下载入门项目

1.情节提要中的“窥视”和“流行”

在第一部分中,我将向您展示如何使用情节提要和一些代码在应用程序中实现Peek和Pop功能。 如果您不知道Peek and Pop是什么,那么基本上这是一种用力按压用户界面元素的方法,以使它成为“ Peek”。

通过这样的预览,您可以松开手指以将其关闭或再次用力推动以将其“弹出”到全屏状态。 “可监视”项目可以是任何视图控制器,包括电子邮件,消息和网页之类的内容,如下面的屏幕快照所示。



3d点击事件 android 3d触摸怎么设置在哪_android


在Xcode中打开starter项目,然后导航到Main.storyboard 。 捏住触控板或按Command +-可以缩小情节提要。 选择下一个屏幕快照中显示的segue。



3d点击事件 android 3d触摸怎么设置在哪_3d点击事件 android_02


选择此segue后,打开“ 属性” 检查器并查找一个名为Peek and Pop的新部分。 启用复选框并配置行为,如下所示。



3d点击事件 android 3d触摸怎么设置在哪_3d点击事件 android_03


在此菜单中,您可以将自定义标识符分配给Peek( 预览 )和Pop( 提交 )segue。 提交segue还具有用于配置情节提要中常规segue的所有功能的选项,例如ClassModuleKind

在iPhone上构建并运行您的应用,然后按右上角的+按钮创建一个新项目。



3d点击事件 android 3d触摸怎么设置在哪_python_04


用力按此项目,您将看到我们获得了该项目的详细视图控制器的预览。



3d点击事件 android 3d触摸怎么设置在哪_3d点击事件 android_05


您将看到我们的详细信息视图尚未显示我们正在预览的项目的正确数据。 这是因为我们尚未为我们在情节提要中定义的自定义预览序列配置视图。 回到您的项目中,打开MasterViewController.swift并使用以下实现替换prepareForSegue(_:sender:)方法:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = objects[indexPath.row] as! NSDate
            let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
            controller.detailItem = object
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    } else if let cell = sender as? UITableViewCell where segue.identifier == "showDetailPeek" {
        let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
        controller.detailItem = cell.textLabel?.text
        controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
        controller.navigationItem.leftItemsSupplementBackButton = true
    }
}

第一个if语句保持不变。 如果未执行此代码,则我们检查发送方是否为UITableViewCell ,并且segue标识符等于"showDetailPeek" 。 如果同时满足这两个条件,则将detailItem配置为单元格的文本。

再次构建并运行您的应用程序。 这次,当窥视项目时,您应该获得正确配置的预览,如下所示。



3d点击事件 android 3d触摸怎么设置在哪_java_06


需要注意的重要一件事是,这些针对Peek和Pop的情节提要配置仅适用于运行iOS 9.1或更高版本的设备。 为了支持运行iOS 9.0的设备,您将需要使用代码配置Peek和Pop功能,如下一节所示。

2.代码中的窥视和流行

尽管比情节提要板设置要复杂一些,但是通过编程实现Peek and Pop还可以使您在用户向上滑动时向预览中添加额外的操作。 请看以下屏幕截图,以更好地理解我的意思。



3d点击事件 android 3d触摸怎么设置在哪_python_07


偷窥和弹出是由UIViewControllerPreviewingDelegate协议在代码中处理的。 在您的项目中,创建一个新的iOS> Source> Swift File并将其命名为MasterPreviewing



3d点击事件 android 3d触摸怎么设置在哪_python_08


将以下代码添加到MasterPreviewing.swift中

import UIKit

extension MasterViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        guard let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("forceViewController") as? ForceViewController else { return nil }
        
        viewController.preferredContentSize = CGSize(width: 0, height: 0)
        
        return viewController
    }
    
    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
        showViewController(viewControllerToCommit, sender: self)
    }
}

我们使MasterViewController类符合UIViewControllerPreviewingDelegate协议。

previewingContext(_:viewControllerForLocation:)方法中,我们从情节ForceViewController实例化一个ForceViewController并返回此对象。 preferredContentSize属性确定Peek预览将出现在屏幕上的大小。 当使用(0,0)大小时,预览会自动使其自身与当前屏幕一样大。

previewingContext(_:commitViewController:)方法中,我们完成了从MasterViewController实例的过渡,并在屏幕上的Peek阶段弹出我们创建的ForceViewController

要使用此新代码,我们还需要注册特定的视图,当牢固按下这些视图时,我们希望生成这些视图。 为此,请打开MasterViewController.swift并将以下代码添加到viewDidLoad()

if traitCollection.forceTouchCapability == .Available {
    self.registerForPreviewingWithDelegate(self, sourceView: forceButton)
}

我们首先检查3D Touch是否在设备上可用(API称为“强制触摸”)。 在这种情况下,我们将forceButton (表底部的那个)注册为Peek和Pop的合格视图。

最后,要将动作添加到预览中,您需要在预览的   查看控制器类。 打开ForceViewController.swift并将以下方法添加到该类:

override func previewActionItems() -> [UIPreviewActionItem] {
    let regularAction = UIPreviewAction(title: "Regular", style: .Default) { (action: UIPreviewAction, vc: UIViewController) -> Void in
        
    }
    
    let destructiveAction = UIPreviewAction(title: "Destructive", style: .Destructive) { (action: UIPreviewAction, vc: UIViewController) -> Void in
        
    }
    
    let actionGroup = UIPreviewActionGroup(title: "Group...", style: .Default, actions: [regularAction, destructiveAction])
    
    return [regularAction, destructiveAction, actionGroup]
}

我们创建三个要与ForceViewController预览一起显示的ForceViewController 。 首先是常规动作,是最常见的动作。 选择此操作后,将执行您在创建操作时定义的代码块(当前为空)。 第二个是破坏性操作,其功能与第一个完全相同,但在预览屏幕上将显示为红色。 最后,我们创建一个动作组,该动作组可以在一个按钮下折叠任意数量的其他动作。

再次构建并运行您的应用。 这次,用力按Force按钮以查看新的ForceViewController预览,如下所示。



3d点击事件 android 3d触摸怎么设置在哪_python_09


在此预览上向上滑动以查看我们在ForceViewController类中定义的操作。



3d点击事件 android 3d触摸怎么设置在哪_python_10


最后,按“ 组...”操作打开该组中包含的操作。



3d点击事件 android 3d触摸怎么设置在哪_android_11


3.通过UITouch检测力

在3D Touch兼容设备上, UITouch类还以两个新属性的形式( forcemaximumPossibleForce获得了一些新功能。 这些属性对于要精确测量施加到屏幕的压力的任何用例都非常有用。

首先将以下方法添加到ForceViewController类中:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first where traitCollection.forceTouchCapability == .Available {
        self.forceOutput.text = "\(touch.force)\n\(touch.maximumPossibleForce)"
    }
}

每当屏幕上的触摸移动时,我们就会进行检测,包括朝向和远离屏幕。 我们从集合中的第一个UITouch对象检索当前施加的力,并在屏幕上显示值。

生成并运行您的应用,然后按“ 强制”按钮以打开 ForceViewController 。 用不同的压力量将其推到屏幕上的任何位置,您将看到屏幕上的标签会相应更新,以显示当前施加的力以及可以施加的最大力。



3d点击事件 android 3d触摸怎么设置在哪_android_12


请注意,这些值与任何物理单位均不相关,并且与用户的3D Touch灵敏度设置无关。 值1.0表示施加在平均触摸上的力。

4.主屏幕快速操作

除了3D Touch提供的新的应用程序内功能外,您还可以在应用程序图标上添加多达四个用于应用程序特定功能的快捷方式。 当用户深深按下主屏幕上您的应用程序的图标时,可以访问这些快速操作,如下面的屏幕快照所示。



3d点击事件 android 3d触摸怎么设置在哪_android_13


您可以为应用程序创建两种主要的快速操作类型: staticdynamic 。 静态快速操作在应用程序的Info.plist中定义,并且始终可用于您的应用程序。 动态快速操作将在您的代码中创建,并添加到应用程序的共享UIApplication对象中。

对于我们的应用程序,我们将创建一个静态和动态快速动作,它们将具有完全相同的实现,并向表格视图添加一个新项。 它将向您展示如何在自己的应用程序中利用两种操作类型。

快速动作由新的UIApplicationShortcutItem类表示,该类具有以下属性:

  • localizedTitle标题快速操作的标题(例如,上面屏幕截图中的“ 新建”标签
  • localizedSubtitle快速操作的可选字幕,显示在主标题下方
  • type一个唯一的字符串标识符,供您用来确定选择了哪个快速操作
  • icon可选的UIApplicationShortcutIcon对象,可以显示系统提供的图标或自定义图像
  • userInfo可选字典,对于将数据与快速动作相关联非常有用

首先,我们将创建静态快速动作。 打开目标的Info.plist文件,并完全按照以下屏幕截图所示添加以下各项:



3d点击事件 android 3d触摸怎么设置在哪_vue_14


请注意, UIApplicationShortcutItemIconType密钥可以与UIApplicationShortcutItemIconFile密钥交换,其值是您要使用的图像文件名。 的 我们提供的UIApplicationShortcutItemUserInfo值也只是一个基本示例字典,向您展示如何设置自己的自定义数据。

接下来,我们将创建动态动作。 打开MasterViewController.swift并在viewDidLoad()方法中添加以下两行代码:

let shortcut = UIApplicationShortcutItem(type: "com.tutsplus.Introducing-3D-Touch.add-item", localizedTitle: "Add Item", localizedSubtitle: "Dynamic Action", icon: UIApplicationShortcutIcon(type: .Add), userInfo: nil)
UIApplication.sharedApplication().shortcutItems = [shortcut]

这样,您就为应用程序创建了静态和动态快速动作。

最后,我们需要处理从主屏幕实际选择这些快速操作时的应用逻辑。 这是由您的应用程序委托的application(_:performActionForShortcutItem:completionHandler:)方法处理的。 打开AppDelegate.swift并将以下方法添加到AppDelegate类:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if shortcutItem.type == "com.tutsplus.Introducing-3D-Touch.add-item" {
        let splitViewController = self.window!.rootViewController as! UISplitViewController
        let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
        let masterViewController = navigationController.viewControllers[0] as! MasterViewController
        masterViewController.insertNewObject(UIButton())
        
        completionHandler(true)
    }
    
    completionHandler(false)
}

我们首先检查快速操作的类型,然后访问MasterViewController对象。 在此对象上,我们调用insertNewObject(_:)方法将新项目插入表视图。 请注意,此方法由 iOS>应用程序>主从应用程序模板,并且需要AnyObject参数。 但是,此参数未在实际的方法实现中使用,并且可以是任何对象。 最后,我们使用一个布尔值来调用completionHandler ,以告诉系统快速操作是否成功执行。

最后一次构建并运行您的应用。 加载完毕后,转到设备的主屏幕,然后牢固地按应用程序图标。 您将看到两个快速操作可用于您的应用程序。



3d点击事件 android 3d触摸怎么设置在哪_3d点击事件 android_15


接下来,按任意一个,您的应用程序将打开,并在表视图中添加一个新项。



3d点击事件 android 3d触摸怎么设置在哪_3d点击事件 android_16


结论

现在,您应该对iOS 9中可用的3D Touch API感到满意,包括Peek和Pop,通过UITouch力度检测以及主屏幕快速操作。 3D Touch提供了许多与您的设备进行交互的新方式,我强烈建议大家在自己的应用程序中采用它。

与往常一样,您可以在下面留下您的评论和反馈。