美文网首页
3DTouch_Peek and Pop

3DTouch_Peek and Pop

作者: anyurchao | 来源:发表于2015-12-10 10:02 被阅读828次

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

    相关文章

      网友评论

          本文标题:3DTouch_Peek and Pop

          本文链接:https://www.haomeiwen.com/subject/piqjhttx.html