3DTouch_Peek and Pop

2015-12-10  本文已影响828人  anyurchao

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都是一个按钮,按钮的事件都是以闭包的形式完成的,非常的方便

上一篇下一篇

猜你喜欢

热点阅读