3D Touch Peek&Pop入门-Swift

今天,我们正在检查最好的3D Touch功能。 你们中有些人可能在想,这与长按有什么不同,对吗?

好吧,目前它的用途可能并没有很大的不同,但是使之成为可能的技术却是完全不同的。

3D Touch将感应您的手指对屏幕施加的压力并触发各种动作。 因此,代替短按或长按,3D Touch可以实现软按和硬按。

通过本教程,您将知道如何在主屏幕快速操作以及“窥视和弹出图像”中实现3D触摸。

在您的应用上实施3D touch之前,您应该检查设备是否支持3D touch。

检查3D Touch支持:

 if(traitCollection.forceTouchCapability == .available { 
registerForPreviewing(with:self,sourceView:view)
}

1.主屏幕快速操作

快速动作只不过是当您强行触摸应用程序图标时,将显示一个菜单。 您可以使用它来快速访问应用程序的特定部分或触发操作。 快速动作分为静态和动态。 每个应用最多可以执行四个快速操作。 您可以定义更多快速动作,但是最多可以显示四个。 此外,静态快速动作将被优先考虑。 因此,如果您定义了三个静态快速动作和两个动态快速动作,则将显示所有三个静态快速动作,但仅显示一个动态快速动作。 您可能已经注意到,应用程序提供了第五个快速操作,称为“共享”。 该操作由操作系统自动提供。

静态快速​​动作

静态快速​​动作在编译时生成,并且始终保持不变。 在安装应用程序之后,甚至在首次启动之前,它们都将立即可用。

动态快速行动

动态快速行动在运行时生成,并通过使用代码反映某种用户行为。 对于每个项目,您都必须创建UIApplicationShortcutItem的实例。 然后,您可以设置所有项目。

让我们从创建新项目开始。 之后,您必须在应用程序的Info.plist定义UIApplicationShortcutItems数组。

源代码:

   UIApplicationShortcutItems  


UIApplicationShortcutItemIconType
UIApplicationShortcutIconAdd
UIApplicationShortcutItemTitle
显示图片
UIApplicationShortcutItemType
addBundleIdentifier .showPictures

在AppDelegate中,添加performActionForshortcutItem函数,并在其中插入以下代码

 如果shortcutItem.type ==“ UIApplicationShortcutItemType” { 
let storyBoard:UIStoryboard = UIStoryboard(名称:“ Main”,包:nil)
让initViewController = storyBoard.instantiateViewController(withIdentifier:“ 3dtouch”)
self.window?.rootViewController = initViewController
self.window?.makeKeyAndVisible()
}

而已。 我已为我的应用快速采取了行动。 当在应用程序图标上进行3D触摸时,它会显示一个名为“显示图片”的快速操作,然后点击它会显示viewController,该控件已在performActionForshortcutItem中实例化。 同样,您可以添加要在3D触摸上执行的快速操作。

2.窥视与流行

随着用户的按压越来越深,交互过程将经历三个阶段:

  • 指示内容预览可用
  • 显示预览,称为“ 窥视”,具有直接操作的选项,称为“ 窥视”快速操作
  • 可选导航到预览中显示的视图,称为弹出窗口

当您使用窥视和弹出时,系统会确定一个相转换到下一相的压力。

偷看

实际上,它为您提供了激活后将要查看的下一个视图控制器的快照。 由于所有活动部件,这也是3D Touch难以实现的功能。

要实现Peeking,请添加UIViewControllerPreviewingDelegate函数。

  func PreviewingContext(previewingContext:UIViewControllerPreviewing,viewControllerForLocation位置:CGPoint)-> UIViewController?  { 
//Here's where you commit (peek)
}

爆裂

在“弹出”中,要求我们在用户决定弹出预览内容时显示视图控制器。 我们已经传递了我们先前为交互的“窥视”部分创建的视图控制器,因此我们仅在导航控制器中显示它,如果用户只是轻按该区域而不是窥视该区域,则会显示该视图控制器。

为此,我们必须包含UIViewControllerPreviewingDelegate函数。

 func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) { 
//Here's where you commit (pop)
}

示例1:在这里,我在UIImageView上实现了图像的窥视和弹出。 如果我们在图像上进行了3D触摸,它将显示窥视,而当在窥视图像上施加更大的力度时,它将图像发送到下一个视图控制器以查看弹出窗口。

速览

 让convertedLocation = view.convert(位置,到:imageView) 
如果imageView.bounds.contains(convertedLocation){
让popVC = storyboard?.instantiateViewController(withIdentifier:“ popVC”)为! popViewController
popVC.popImage = imageView.image!
  //设置你的身高 
popVC.preferredContentSize = CGSize(宽度:0.0,高度:300)
PreviewingContext.sourceRect = imageView.frame
返回popVC
}其他{
返回零
}

设置流行

 显示(viewControllerToCommit,发送者:自我) 

示例2:您还通过实现UICollectionView和UITableView的peek和pop

  //对于CollectionView 
警惕让indexPath = collectionView?.indexPathForItem(at:location)else {return nil}
守护让cell2 = collectionView.cellForRow(at:index)else {return nil}
  //对于TableView 
警卫让indexPath = tableView?.indexPathForItem(at:location)else {return nil}
守护让cell2 = tableview.cellForRow(at:indexPath)else {return nil}
 警卫让popVC =故事板吗?instantiateViewController(withIdentifier:“ popVC”)为?  popViewController else {return nil} 
让照片=照片[indexPath.row]
popVC.photo =照片
  //设置你的偷看高度 
popVC.preferredContentSize = CGSize(宽度:0.0,高度:300)
PreviewingContext.sourceRect = cell.frame
返回popVC

而已。 你偷看了。

查看我的示例项目 Github回购

如果您认为本教程有用,那么您现在知道该怎么做。 点击该拍手按钮,然后跟随我在您的供稿上获取更多文章和教程