zoukankan      html  css  js  c++  java
  • iOS iPad开发之UIPopoverController的使用

    1. 什么是UIPopoverController?

    是iPad开发中常见的一种控制器(在iphone上不允许使用)

    跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController

    它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面

    2.怎么使用UIPopoverController?

      2.1 使用的思路(初步)

        1>创建一个UIPopover

        2>确定内容

        3>设置尺寸

        4>从哪里显示出来

      2.2 示例代码一  

        // 创建一个UIPopover

        UIPopoverController *pop = [[UIPopoverController alloc]init];

        // 确定内容

        QKTableViewController *qktb = [[QKTableViewController alloc]init];

        pop.contentViewController = qktb;

        // 设置尺寸

        pop.popoverContentSize = CGSizeMake(320, 160);

        // 从哪里出来,sender是 - (IBAction)menu:(id)sender 的参数,该方法是点击导航控制器的UIBarbuttonItem时调用

        [pop presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

      运行程序报错,报错原因如下,由此可见UIPopover在创建时,就必须设置contentViewController

      reason: '-[UIPopoverController init] is not a valid initializer. You must call -[UIPopoverController initWithContentViewController:].'

      2.3 示例代码二,解决popover非法初始化的问题  

        // 拿到内容

        QKTableViewController *qktb = [[QKTableViewController alloc]init];

        // 创建一个UIPopover

        UIPopoverController *pop = [[UIPopoverController alloc]initWithContentViewController:qktb];

        // 设置尺寸

        pop.popoverContentSize = CGSizeMake(320, 160);

        // 从哪里出来

        [pop presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

      在iOS7中运行程序报错,报错原因如下,由此可见UIPopover在创建时,就必须设置contentViewController, 因为pop是局部变量,方法执行完毕就释放了,解决办法是搞一个强引用,iOS8之前确定是每个popover都有一个强引用去保住它的命.

      reason: '-[UIPopoverController dealloc] reached while popover is still visible.'  // 当popover仍旧显示的时候它释放了

       在iOS8中运行程序正常.说明苹果在iOS8针对popover有专门的优化,减少了代码量.

      // iOS7中解决崩溃的办法是加强引用  

      self.popover = pop;

      2.4 示例代码三

      // 设置尺寸,如果把设置尺寸的代码注释掉,popover的默认尺寸是320x493 (popover的三角形占13的高度)

         // pop.popoverContentSize = CGSizeMake(320, 160);

      2.5 示例代码四

      // 在ContentViewController的viewDidLoad里设置尺寸

      self.contentSizeForViewInPopover = CGSizeMake(100, 100); // iOS6或iOS6之前可以用这个属性,该属性在iOS7过时,但iOS7中使用依然有效,iOS8中使用无效

      self.preferredContentSize = CGSizeMake(150, 150); // iOS7或iOS7之后建议用这个属性,该属性是在iOS7生效的,所以这里就涉及到iOS678的版本适配问题

      2.6 示例代码五

      // UIPopover可以指向任何view,下面这2行代码等价

      [pop presentPopoverFromRect:self.myBtn.bounds inView:self.myBtn permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

      [pop presentPopoverFromRect:self.myBtn.frame inView:self.myBtn.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

      2.7 示例代码六

      // UIPopover也有代理方法

      pop.delegate = self;

        self遵守<UIPopoverControllerDelegate>协议后可以去实现协议方法

        // 决定点击蒙版,popover是否可以消失   

        - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController;

        // popover消失后调用下面的这个代理方法,

        // 需要注意:如果popoer的消失是因为执行了这行代码[pop dismissPopoverAnimated:BOOL]而消失的,不会执行下面这个代理方法

        - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController;

        // popover的位置改变,例如横竖屏切换,调用下面的代理方法

        - (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView **)view NS_AVAILABLE_IOS(7_0);

      2.8 示例代码七

      // 穿透蒙版,点击myBtn和myBtn2的区域,会穿透蒙版

         pop.passthroughViews = @[self.myBtn,self.myBtn2];

      2.9 使用UIPopover的思路(最终)

      1>创建一个UIPopover (创建的同时设置contentViewController)

      2>从哪里显示出来 

      至于它的尺寸最好不要写死,最好是由contentViewController决定,所以使用UIPopover只要上面2步即可

    3. 总结:   

      为什么使用UIPopover还需要确定内容?

        因为UIPopover继承自NSObject,它不像UIViewUIViewController那样具有显示功能.

      为什么使用UIPopover还需要确定从哪里显示出来?

        和UIView的frame一样,光有size,而不设置origin是不行的.

      形象理解:

      1>可以把UIPopover比作一个相框

      2>中间的显示什么内容由照片决定 

      3>可以先买好相框(尺寸固定),裁剪好照片放进去.

      4>也可以先洗好照片,再根据照片的尺寸去买相框(尺寸由照片决定)

      5>相框装上照片后,需要考虑把相框挂哪.

  • 相关阅读:
    Nginx源码编译安装与负载均衡配置实践
    jquery_file_upload in Rails(ajax实现多张图片上传)
    Nokogiri相关网站
    rails中 url和path的区别
    Unique Paths
    Kinect for windows的脸部识别
    .Net给图片添加水印效果
    大型高性能ASP.NET系统架构设计
    如何来提高网站的访问速度,其中包括服务器的配置建议,asp.NET代码的编写及前端页面的优化等等
    URL中#号(井号)的作用
  • 原文地址:https://www.cnblogs.com/oumygade/p/4313782.html
Copyright © 2011-2022 走看看