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生效的,所以这里就涉及到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的使用的更多相关文章
- (一〇六)iPad开发之UIPopoverController的使用
很多App里都有一种点击显示的悬浮气泡菜单,例如下图: 在iPad上可以使用UIPopoverController实现这个功能,popoverController继承自NSObject而不是UIVie ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程开发之NSOperation - 快上车,没时间解释了!
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS游戏开发之UIDynamic
iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...
- iOS多线程开发之NSOperation
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS多线程开发之GCD(死锁篇)
上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...
- iOS多线程开发之GCD(中级篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS开发之UIPopoverController
1.概述 是iPad开发中常见的一种控制器(在iPhone上不允许使用),跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController,它只占用部分屏幕空间来呈现信 ...
- iOS敏捷开发之道,经常使用的宏定义总结
iOS开发中,直接在pch文件里导入宏定义. 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度. 以下是 个人总结的一些宏定义. 假设大家有其它的经常使用的宏定义.欢迎加入.我会定期更新这个bl ...
随机推荐
- 在linux中安装adb和fastboot工具
我用的是archlinux,在官方的软件仓库里就可以找到对应的包,包的名字叫:android-tools 据说debian系列的软件包是两个,分别是:android-tools-adb, androi ...
- cxf(3.1.1) 异常Caused by: java.io.FileNotFoundException: class path resource [META-INF/cxf/cxf-extension-soap.xml]
Caused by: java.io.FileNotFoundException: class path resource [META-INF/cxf/cxf-extension-soap.xml] ...
- [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
环境: 操作系统:64位WIN7 数据库:SQL Server 2000 SP1 开发语言:J2EE 在Servlet连接数据库时出错提示: [Microsoft][ODBC 驱动程序管理器 ...
- IIS 服务没有及时响应启动或控制请求
微软刚发布的补丁的原因,据说补丁KB939373.KB942831都会影响iis的正常运行,但是我在“添加或删除程序里”(要勾选:显示更新,才能会显示所打的补丁)没有发现以上两个补丁.最后,我发现把K ...
- Java判断访问设备为手机、微信、PC工具类
package com.lwj.util; import javax.servlet.http.HttpServletRequest; /** * 判断访问设备为PC或者手机--工具类 * * @de ...
- Dynamics AX 2012 R2 AIF 错误 '/MicrosoftDynamicsAXAif60' 应用程序中的服务器错误
Reinhard在使用AIF的时候,服务端收到如下错误提示之一,并触发InsufficientMemoryException 和ServiceActivationException异常,那么代表你服务 ...
- NET中的类型和装箱/拆箱原理
谈到装箱拆箱,DebugLZQ相信给位园子里的博友一定可以娓娓道来,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么Deb ...
- shell脚本 空格
1.定义变量时, =号的两边不可以留空格. eg: gender=femal----right gender =femal---–wrong gender= femal---–wrong 2.条件测试 ...
- LR常见问题
(1)LoadRunner录制脚本不弹出IE浏览器 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到打不开浏览器的情况,可以用下面的方法解决.启动浏览器,打开Internet选项对话 ...
- [转]使用xcode4 workspace 多个project协同工作
转载地址:http://erlangprogram.com/use-xcode4-workspace 一般的某个应用单独新建一个 project 就可以了,然后把所有的程序文件都放在里面,这个可以 ...