UIPopoverPresentationController使用
UIPopoverPresentationController是什么?
iOS8.0之后引入的一个方便开发者创建带箭头的弹出控制器,类似qq消息页面点击右上角加号弹出的视图。继承UIPresentationController类,可用于iPhone和iPad ,比之前的UIPopoverController使用方便。下面给出实现的效果图:

UIPopoverPresentationController怎么使用?
UIPopoverPresentationControllerl类实例不需要直接创建,因为在UIViewController中有一个popoverPresentationController属性,可以从它获取。
这里给出基本的使用方法:
第一步:
创建一个UIViewController类的实例,最好采用他的子类,对它进行一些设置,这里我们设置了preferredContentSize属性和modalPresentationStyle,modalPresentationStyle一定要设置为UIModalPresentationPopover,而preferredContentSize可以不设置,不设置的话,系统会自动给一个几乎充满整个屏幕的视图。
ItemPopoverViewController *controller = [[ItemPopoverViewController alloc] init];
controller.preferredContentSize = CGSizeMake(, );
controller.modalPresentationStyle = UIModalPresentationPopover;
第二步:
对UIPopoverPresentationController进行设置,
首先看一下UIPopoverPresentationController中的一些属性,从下图可以看到sourceView和barButtonItem,sourceView是用于UIView类及其子类的,barButtonItem用于UIBarButtonItem,这两个属性是告诉UIPopoverPresentationController实例出现在哪个视图上,区别在于sourceView还需要指定sourceRect,否则pop出来的视图位置将不正确,一般我们给sourceRect赋当前视图的bounds属性就可以了。
@property (nullable, nonatomic, strong) UIView *sourceView;
@property (nonatomic, assign) CGRect sourceRect; // By default, a popover is not allowed to overlap its source view rect.
// When this is set to YES, popovers with more content than available space are allowed to overlap the source view rect in order to accommodate the content.
@property (nonatomic, assign) BOOL canOverlapSourceViewRect NS_AVAILABLE_IOS(9_0); @property (nullable, nonatomic, strong) UIBarButtonItem *barButtonItem;
现在看看demo里的代码
// 出现在UIBarButtonItem上面的
UIPopoverPresentationController *popController = [controller popoverPresentationController];
popController.delegate = self;
popController.barButtonItem = self.barItem;
// 出现在view上面的
UIPopoverPresentationController *popController = [controller popoverPresentationController];
popController.sourceView = self.button;
popController.sourceRect = self.button.bounds;
popController.delegate = self;
从上面代码可以看出这两种方式区别不大,注意到我们在这里指定了delegate属性,这是很重要的,下面将介绍它的作用。
第三步:
这是最后一步,控制器要显示,就需要用present的方法
[self presentViewController:controller animated:YES completion:nil];
同样的,要消失的话,调用下面这个方法
[self dismissViewControllerAnimated:YES completion:nil];
到这里,基本上我们已完成了所有内容,但是如果你看效果的话,会发现,并不是pop出一个视图,而是占据整个屏幕的视图,相信你还记得上面提到的代理,我们需要实现一个方法:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
}
加上这个之后,就能看到pop出来的效果了。
UIPopoverPresentationController显示内容
如果要显示内容,只需在相应视图控制器中添加内容即可,但是,因为一般我们都会设置preferredContentSize这个属性,设置了之后,显示的视图往往比较小,在viewDidLoad中控制器的根视图大小还不是我们设置的preferredContentSize这个值,不能用来做参考,创建的子视图的大小可以在viewWillLayoutSubviews或者viewDidLayoutSubviews中进行更新。
以上就是UIPopoverPresentationController基本用法.
demo下载地址:下载
UIPopoverPresentationController使用的更多相关文章
- iOS8新特性(1)-UIPopoverPresentationController使用
从iOS 8开始,苹果提出新的 UIPopoverPresentationController代替UIPopoverController: 新的UIPopoverPresentationControl ...
- iPad 控件 UIPopoverPresentationController 使用 iPhone可用
UIPopoverController 在iOS9之后被废弃了,,, iOS8 新控件UIPopoverPresentationController可运用在iphone和iPad上,使用基本同 UIP ...
- iOS:模态弹出窗控制器UIPopoverPresentationController
模态弹出窗控制器:UIPopoverPresentationController 实质:就是将内容控制器包装成PopoverPresentationController的形式,然后再模态出来,必须指定 ...
- iOS iOS8新特性--UIPopoverPresentationController
1.回顾UIPopoverController的使用,下面这份代码只能在ipad下运行 // 初始化控制器,SecondViewController类继承自UIViewController Secon ...
- UIPopoverPresentationController的使用
前言 最近项目中很多地方有一个相同的需求,那就是点击一个按钮的时候在按钮的某一个方向弹出一个视图,这个视图需要带有一个箭头指向,就像下图一样.要实现这个功能,就要用到UIPopoverPresenta ...
- 美团HD(3)-加载分类导航数据
DJHomeViewController.m /** 设置导航栏左侧内容 */ - (void)setupLeftNavItem { // Logo UIImageView *logoView = [ ...
- iPad编程
1. iPad 现有型号: iPad Pro, iPad Air, iPad mini 均配备Retina显示屏.早期还有iPad 依次对应的坐标系及分辨率: iPad Pro 坐标系:1366 x ...
- iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿
iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备 ...
- popoverPresentationController UIPopoverController 使用方法详解
之前iPad特有的控件,现在iPhone亦可使用. 点击按钮,弹出popOverVC. 按钮的点击事件: - (IBAction)pickOrderAction:(UIButton *)sender ...
随机推荐
- STL容器之优先队列(转)
STL容器之优先队列 原地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 优先级队列,以前刷题的时候用的比较熟,现在竟然我只能记得它的关 ...
- 酷睿彩票合买代购网站管理系统 v2016 - 源码下载 有合买功能 有免费版 标准版 高级版
源码介绍 免费版下载地址 电信 浙江腾佑 网鼎科技 正易网络下载 联通 网鼎联通 标准版联系QQ:1395239152 彩票合买代购网站管理系统公司独立开发,完全拥有软件自主知识产权.具有电脑We ...
- 远程登录Linux服务器修改ssh端口
公司有部分服务器root密码被禁用,有部分没有禁用,禁用root的服务器需要通过tomcat用户登陆系统,切换至root修改端口,没有禁用的直接修改root密码: #-*- coding:utf-8 ...
- SpringMVC中的java.lang.ClassNotFoundException: org.aspectj.weaver.BCException 调试过程记录
报错原因 上文本描述 java.lang.NoClassDefFoundError: org/aspectj/weaver/BCException at java.lang.Class.getDecl ...
- CentOS6.7 防火墙规则(Iptables)
查看防火墙的状态 /etc/init.d/iptables status 开启防火墙 /etc/init.d/iptables start 关闭防火墙 /etc/init.d/iptables sto ...
- 10.Java 加解密技术系列之 DH
Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...
- Servlet 详解
1.什么是 Servlet? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...
- jquery attr处理checkbox / select 等表单元素时的坑
先上html结构 <body> <form action=""> <input type="checkbox" id=" ...
- Redis 小白指南(四)- 数据的持久化保存(草稿)
Redis 小白指南(四)- 数据的持久化保存 简介 因为 redis 将数据保存在内存中,很容易诱发的一个问题就是,程序崩溃或服务器重启等情况如何保证数据的正常存储. 当我们以 redis 作为主数 ...
- javaSE_06Java中的数组(array)
1.什么是数组? 顾名思义,即为数据的组合或集合,数组就是用来表示一组数据的. 比如没有数组之前,我们要存储多个姓名的信息 String name1; String name2; String nam ...