Peek 和 Pop,全新功能登场。
Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们。例如,轻按屏幕,可用 Peek 预览收件箱中的每封邮件。如果要打开其中一封,只需按压时继续稍微用力,即可用 Pop 点开邮件。
引用苹果官网的介绍之后,看下我们要实现的效果:
首页使用UITableView,显示基本基本信息
重按其中的某一个cell,显示Peek视图
向上滑动,看到下面的选项
正式开始
1. 创建Single View Application工程,在ViewController.swift中添加UITableView
Demo中使用了StoryBoard进行设置页面,大家可以任意选择。
2. 在设置每行cell上显示什么内容的方法中,添加如下代码
获取每一个cell之后,把cell注册给控制器,这样,我们才可以在重按的时候显示Peek视图
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// 获取重用的cell
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
// 重要代码: 使用控制器调用方法,注册previewAction的代理和视图
self.registerForPreviewingWithDelegate(self, sourceView: cell)
// 显示数据
let person = allDataArray[indexPath.row]
cell.imageView?.image = UIImage(named: "dog")
cell.textLabel?.text = person.name
cell.detailTextLabel?.text = person.phone
// 返回cell
return cell
}
刚刚除了注册,还将self设置为了代理,下面继续
3. 遵守UIViewControllerPreviewingDelegate,并实现协议中必须实现协议方法
使用extension进行拓展协议
首先实现第一个协议方法previewingContext:viewControllerForLocation,当重按的时候,会执行此协议方法,我们需要在这个方法中返回要显示的控制器,并给控制器上的一些控件赋值
extension ViewController: UIViewControllerPreviewingDelegate {
// 重按执行此方法
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
// 创建新控制器(从Storyboard中根据标示符获取)
let detailVC = self.storyboard?.instantiateViewControllerWithIdentifier("detailVC") as! DetailViewController
// 注意:在这里设置新控制器的背景颜色,其实是破坏了控制器的声明周期。我们的目的是在未推出控制器的时候,便使控制器去加载Storyboard中的控件
detailVC.view.backgroundColor = UIColor.cyanColor()
// 获取模型
let cell = previewingContext.sourceView as! UITableViewCell
let indexPath = tableView.indexPathForCell(cell)
let person = allDataArray[(indexPath?.row)!]
// 获取模型的数据并显示
detailVC.imageView.image = UIImage(named: "dog")
detailVC.nameLabel.text = person.name
detailVC.phoneLabel.text = person.phone
detailVC.introduceLabel.text = person.introduce
// 返回重按显示的控制器
return detailVC
}
}
注意:如果只实现上面一个协议方法是不可行的,还有另外一个方法previewingContext:commitViewController,当重按显示之后,再增大力度按的时候,可以执行如下方法,直接推出控制器
extension ViewController: UIViewControllerPreviewingDelegate {
// 当我们重按显示出控制器之后,再加大力度去按,就会执行此方法,则直接推出控制器
func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
// 直接推出控制器
self.showViewController(viewControllerToCommit, sender: self)
}
}
我们实现了视图的显示,但是还没有显示出下面的操作选项。下面,继续。。。
4. 显示Peek视图下面的选项
注意了,这些选项不是写在ViewController.swift文件中的,而是写在显示的控制器,也就是在DetailViewController.swift中的
在DetailViewController.swift中重写如下方法:
override func previewActionItems() -> [UIPreviewActionItem] {
// 创建UIPrewviewAction对象,一个代表一个事件
// 默认的样式
let defaultPreviewAction = UIPreviewAction(title: "默认", style: UIPreviewActionStyle.Default) { (previewAction, viewController) -> Void in
print("默认")
}
// 选中的样式
let selectedPreviewAction = UIPreviewAction(title: "选择", style: UIPreviewActionStyle.Selected) { (previewAction, viewController) -> Void in
print("Selected")
}
// 破坏性的样式
let destructivePreviewAction = UIPreviewAction(title: "破坏性", style: UIPreviewActionStyle.Destructive) { (previewAction, viewController) -> Void in
print("Destructive")
}
// 把几个Action添加到数组中,并返回
return [defaultPreviewAction, selectedPreviewAction, destructivePreviewAction]
}
每一个Action都是一个按钮,按钮的事件都是以闭包的形式完成的,非常的方便