美文网首页
IOS IPad UIPopoverController 和 p

IOS IPad UIPopoverController 和 p

作者: 越天高 | 来源:发表于2020-06-09 16:24 被阅读0次
    • UIPopoverController是iPad开发中常见的一种控制器,
    • 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController
    • 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面

    UIPopoverController 使用步骤

    1. 设置内容控制器
      由于UIPopoverController直接继承自NSObject,不具备可视化的能力
      因此UIPopoverController上面的内容必须由另外一个继承自UIViewController的控制器来提供,这个控制器称为“内容控制器”
      在初始化UIPopoverController的时候传入一个内容控制器
    - (id)initWithContentViewController:(UIViewController *)viewController
    

    更改内容控制器

    @property (nonatomic, retain) UIViewController *contentViewController;
    - (void)setContentViewController:(UIViewController *)viewController animated:(BOOL)animated;
    
    1. 设置内容的尺寸
      显示出来占据多少屏幕空间
      方案1: 通过UIPopoverController对象设置
    @property (nonatomic) CGSize popoverContentSize;
    - (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;
    

    方案2: 通过内容控制器设置

    @property (nonatomic) CGSize preferredContentSize;
    
    1. 设置显示的位置
      从哪个地方冒出来
      围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)
    - (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item 
    permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections 
    animated:(BOOL)animated;
    

    围绕着某一块特定区域显示(箭头指定那块特定区域)

    - (void)presentPopoverFromRect:(CGRect)rect 
    inView:(UIView *)view 
    permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections 
    animated:(BOOL)animated;
    
    1. 关闭UIPopoverController
    - (void)dismissPopoverAnimated:(BOOL)animated;
    

    注意: 防止点击UIPopoverController区域外消失

    • 问题描述
      只要UIPopoverController显示在屏幕上,UIPopoverController背后的所有控件默认是不能跟用户进行正常交互的
      点击UIPopoverController区域外的控件,UIPopoverController默认会消失
    • 解决方案
      解决办法是设置passthroughViews属性
      @property (nonatomic, copy) NSArray *passthroughViews;
      这个属性是设置当UIPopoverController显示出来时,哪些控件可以继续跟用户进行正常交互。这样的话,点击区域外的控件就不会让UIPopoverController消失了

    iOS8.0之后的的popover
    1.自定义控制器ContentViewController为内容控制器

    //创建内容控制器
            let contentVC = UIViewController()
            contentVC.preferredContentSize = CGSize(width: 50, height: 100)
            contentVC.view.backgroundColor = UIColor.orange
            
            //2.设置modal效果
            contentVC.modalPresentationStyle = .popover
            
            //2.1设置弹出的方向
            contentVC.popoverPresentationController?.sourceView = view
            contentVC.popoverPresentationController?.sourceRect = sender.frame
            
            //2.2设置可以穿透的控件,
            contentVC.popoverPresentationController?.passthroughViews = [btn1, btn2]
            
            //设置背景图层
            contentVC.popoverPresentationController?.backgroundColor = UIColor.systemPink
            
            
            //弹出
            present(contentVC, animated: true, completion: nil)
    

    常见错误

    1. popover还没消失就被销毁[UIPopoverController dealloc] reached while popover is still visible.
      当popover仍旧可见的时候,不准销毁popover对象
      在销毁popover对象之前,一定先让popover消失(不可见)

    美团主页使用popController的逻辑

    https://github.com/WhereFindYouAgin/swiftMeitTuanHD

    相关文章

      网友评论

          本文标题:IOS IPad UIPopoverController 和 p

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