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生效的,所以这里就涉及到iOS6\7\8的版本适配问题

  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,它不像UIView\UIViewController那样具有显示功能.

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

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

  形象理解:

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

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

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

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

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

iOS iPad开发之UIPopoverController的使用的更多相关文章

  1. (一〇六)iPad开发之UIPopoverController的使用

    很多App里都有一种点击显示的悬浮气泡菜单,例如下图: 在iPad上可以使用UIPopoverController实现这个功能,popoverController继承自NSObject而不是UIVie ...

  2. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  3. iOS多线程开发之NSOperation - 快上车,没时间解释了!

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  4. iOS游戏开发之UIDynamic

    iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...

  5. iOS多线程开发之NSOperation

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  6. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  7. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  8. iOS开发之UIPopoverController

    1.概述 是iPad开发中常见的一种控制器(在iPhone上不允许使用),跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController,它只占用部分屏幕空间来呈现信 ...

  9. iOS敏捷开发之道,经常使用的宏定义总结

    iOS开发中,直接在pch文件里导入宏定义. 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度. 以下是 个人总结的一些宏定义. 假设大家有其它的经常使用的宏定义.欢迎加入.我会定期更新这个bl ...

随机推荐

  1. C语言 在VS环境下一个很有意思的报错:stack around the variable was corrupted

    今天做一个很简单的oj来温习下c 语言 题目如下 输入 3位正整数 输出 逆置后的正整数 代码如下: #include"stdio.h"int main(){ float h,su ...

  2. MVC返回JSON数据格式书写方式

    返回json数据格式,多个返回值加,隔开 [Route("api/users/web")] //如果不加这个路由请这样调用:/api/users/web?schoolname=十五 ...

  3. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数008,matrix,矩阵函数

    ** 3dFromFundamentalMatrix( Rows1, Cols1, Rows2, Cols2, CovRR1, CovRC1, CovCC1, CovRR2, CovRC2, CovC ...

  4. C#:涉及DPI的高分辨率下的显示问题

    一.背景 在PC机上显示正常,在高分辨率下的Pad上,显示出现问题: 1.显示在屏幕最右端的窗体(控件)显示不出来: 2.截图时,被截图的界面字体文字变大,界面因此显示不全. 二.解决方法: 方法一: ...

  5. C语言中执行到预编译

    在Linux中,执行命令:gcc -o linux.i linux.c -E

  6. 使用Netty收发二进制报文问题记

    1.java二进制编解码 byteBuffer.flip() byteBuffer.getInt() 与 byteBuf.getInt(11) 2.粘包拆包问题 LengthFieldBasedFra ...

  7. python: jquery实现全选 反选 取消

    引入这个jquery-1.12.4.js jquery实现全选 反选 取消 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...

  8. 浅谈 PHP 与手机 APP 开发(API 接口开发)

    本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人一.先简单回答两个问题:1.PHP 可以开发客户端?答:不可以, ...

  9. WPFのInkCanvas作为蒙版透明笔迹不透明

    本人最近利用inkcavas做一个蒙版的功能,结果发现笔迹稀释了,经过一番查找发现:应该讲inkcavas的背景设置为白色,然后透明,而不是将整个控件透明,具体代码: <InkCanvas Na ...

  10. 【前端】Web前端学习笔记【1】

    ... [2015.12.02-2016.02.22]期间的学习笔记. 相关博客: Web前端学习笔记[2] 1. JS中的: (1)continue 语句 (带有或不带标签引用)只能用在循环中. ( ...