美文网首页iOS UIObjective C开发
在iPhone上面实现popover菜单

在iPhone上面实现popover菜单

作者: 流星大石头 | 来源:发表于2016-04-24 19:12 被阅读3037次
    效果图
    2.gif

    github链接地址:https://github.com/changanli/Popover

    简单介绍
    • 在iOS7.0之前,我们使用UIPopoverController实现popover功能,但仅限制在iPad上使用。在iOS8.0开始,苹果推出了UIPopoverPresentationController来替代了UIPopoverController,这个新的api可以在iPad和iphone上面同时使用,简化了通用项目的开发。

    • 按照popover的sourceView的不同,我们将popover分类两类:一类sourceView是UIBarButtonItem,另一类不是UIBarButtonItem的

    • popover上面有一个小箭头,它的参考点的位置是sourceView的左上角,将sourceRect设置成来源是视图的bounds时,它的箭头就在中间位置显示

    *注意:
    如果想要在iphone上面看到popover的效果,首 先需要取消系统默认的自适应效果,iOS系统会根据设 备的不同来进行自适应,因为自适应的modal模式是从底部弹出来。

    popover实现菜单效果的步骤
    • 创建目标控制器

    • 设置目标控制器的Modal类型为了Popover

    • 设置目标控制器的显示大小
      以下步骤必须在modal出目标控制器的监听事件中进行,否则会出现第一次modal出来是popover,第二次就变成了从底部弹出了

    • 获取目标控制器的popoverPresentationController
      如果不设置背景颜色,小箭头点击的时候会出现黑色

    • 给popoverPresentationController设置背景颜色

    • 设置popoverPresentationController的sourceView和sourceRect

      • sourceView要设置popover依赖于哪个控件
      • sourceRect设置popover的参考点的位置
    • 根据sourceView来判断是否设置barButtonItem
      如果sourceView是UIBarButtonItem类型,必须要设置barButtonItem。如果不是,就不用设置了

    • Modal目标控制器

    • 在代理方法中将自适应类型设置None

    代码实现 Swift3.0 + Xcode8.2.1
    
    class ViewController: UIViewController {
        
        var dest:UIViewController? = nil
        
        override func viewDidLoad() {
            super.viewDidLoad()
            //1.创建目标控制器
            let destVC = UIViewController()
            destVC.view.backgroundColor = UIColor.red
            //2.设置目标控制器Modal出来的样式
            destVC.modalPresentationStyle = .popover
             //3.设置目标控制器Modal出来之后的大小
            destVC.preferredContentSize = CGSize(width:100, height: 200)
            dest = destVC
            let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
            btn.setTitle("全部", for: .normal)
            btn.addTarget(self, action: #selector(ViewController.popover(sender:)), for: .touchUpInside)
            btn.setTitleColor(UIColor.orange, for: .normal)
            navigationItem.rightBarButtonItem = UIBarButtonItem(customView: btn)
            
        }
        
        func popover(sender:UIButton) {
           //4.获取目标控制器的popoverPresentationController
            guard let popoverVC = dest!.popoverPresentationController else {
                return
            }
            //5.给popoverVC设置背景颜色
            popoverVC.backgroundColor = UIColor.white
           //5.给popoverPresentationController设置代理
            popoverVC.delegate = self
           //6.设置sourceView和sourceRect
            popoverVC.sourceView = sender
            popoverVC.sourceRect = sender.bounds
             //7.如果sourceView是UIBarButtonItem类型,必须要有下面这一句.这里的sender是UIButton类型的,所已不需要下面这一句
            // popoverVC.barButtonItem = UIBarButtonItem(customView: sender)
           //8.present目标控制器
            present(dest!, animated: true, completion: nil)
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        
    }
    
    extension ViewController:UIPopoverPresentationControllerDelegate {
       //9.在代理方法中将自适应类型设置None
        func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
            return .none
        }
    }
    

    相关文章

      网友评论

      • Jimsir:你有这个Demo吗,这段代码我在本地试了试,效果不对(我的环境是:swift 3.0)
        class ViewController: UIViewController {

        var dest:UIViewController? = nil

        override func viewDidLoad() {
        super.viewDidLoad()

        let destVC = UIViewController()
        destVC.view.backgroundColor = UIColor.red

        destVC.modalPresentationStyle = .popover

        destVC.preferredContentSize = CGSize(width:100, height: 200)
        dest = destVC
        let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
        btn.setTitle("全部", for: .normal)
        btn.addTarget(self, action: #selector(ViewController.popover(sender:)), for: .touchUpInside)
        btn.setTitleColor(UIColor.orange, for: .normal)
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: btn)

        }

        func popover(sender:UIButton) {
        guard let popoverVC = dest!.popoverPresentationController else {
        return
        }

        popoverVC.backgroundColor = UIColor.white
        popoverVC.delegate = self

        popoverVC.sourceView = sender
        popoverVC.sourceRect = sender.bounds

        present(dest!, animated: true, completion: nil)
        }

        override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
        }

        }

        extension ViewController:UIPopoverPresentationControllerDelegate {
        func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {

        return .none
        }

        }
        Jimsir:@流星大石头 谢谢,是我的失误,2.3转3.0转着转着都转晕了哈哈
        流星大石头:Swift3.0Demo地址:https://github.com/changanli/Popover
        流星大石头:extension ViewController:UIPopoverPresentationControllerDelegate {
        func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
        }
        }

        extension里面的代理方法错了,我的Demo是Swift2.3+Xcode7.3.1,把extension里面的内容换成上面这个就可以了

      本文标题:在iPhone上面实现popover菜单

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