UIPopoverPresentationController的使用
前言
最近项目中很多地方有一个相同的需求,那就是点击一个按钮的时候在按钮的某一个方向弹出一个视图,这个视图需要带有一个箭头指向,就像下图一样。要实现这个功能,就要用到UIPopoverPresentationController这个类了。
简介
一个带有箭头的弹出视图从出现到消失的整个过程,都是UIPopoverPresentationController类的实例在管理,UIPopoverPresentationController类的实例管理着弹出视图的外形和其它的一些性质。
我们不需要直接去创建这个类的对象,当我们把这个弹出视图对应的视图控制器的modalPresentationStyle属性设置为UIModalPresentationPopover时,viewcontroller就会拥有一个popoverPresentationController属性,它就是UIPopoverPresentationController类型的,用它来管理这个弹出视图的外形和其它一些性质。
UIPopoverPresentationControllerDelegate
UIPopoverPresentationControllerDelegate对象会通知它的delegate整个弹出视图从弹出到消失的整个过程。下面是其主要的API:
通知delegate视图将要呈现:
- (void)prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController;
询问delegate视图是否应该消失
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController;
通知delegate视图已经消失
- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController;
相关属性
- backgroundColor
上图中设置的backgroundColor是红色,上图中弹出视图是由两部分叠加的,一部分是上面的viewcontroller的View,其背景色是黄色,还有一部分是承载viewcontroller的View的视图,这个视图是由viewcontroller的popoverPresentationController对象来管理的。 - passthroughViews
这是一个数组,里面装着视图,一般情况下在弹出视图可见的情况下,点击界面上其他视图是无效的,这会导致弹出视图消失,但是这个数组中的视图不会这样,在弹出视图可见的情况下仍然可以点击这些视图。 - canOverlapSourceViewRect
这是一个布尔值,说明弹出视图是否可以和sourceRect重叠。 - sourceView
这个属性其实就是要指出弹出视图的箭头要指向哪个视图。 - permittedArrowDirections
这个属性要确定弹出视图的箭头的方法,它是一个枚举值,上图中设置的箭头方向是左边。 - sourceRect
有了sourceView和permittedArrowDirections还不能完全确定箭头的位置,还需要一个参数,这个参数就是sourceRect。上图中设置的sourceRect为_button.bnounds,当我们把sourceRect设置为CGRectMake(0, 0, _button.bounds.size.width, _button.bounds.size.height / 2.0);也即是这个按钮的上半区域的时候,我们看一下效果:0D46A23E-3BF1-4241-8A06-1BB92235F068.png
简单应用
TestViewController *testVC = [[TestViewController alloc] init];
testVC.preferredContentSize = CGSizeMake(150, 150);
testVC.modalPresentationStyle = UIModalPresentationPopover;
testVC.popoverPresentationController.delegate = self;
testVC.popoverPresentationController.sourceView = _button;
testVC.popoverPresentationController.sourceRect = CGRectMake(0, 0, _button.bounds.size.width / 2.0, _button.bounds.size.height / 2.0);
testVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionLeft;
testVC.popoverPresentationController.backgroundColor = [UIColor redColor];
testVC.popoverPresentationController.canOverlapSourceViewRect = NO;
[self presentViewController:testVC animated:YES completion:^{
}];
注意,这样做的话是无论如何都不能成功显示弹出视图的,我们还需要实现代理的一个方法:
#pragma mark - <UIPopoverPresentationControllerDelegate>
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
}
这样就能成功实现了。
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使用
UIPopoverPresentationController是什么? iOS8.0之后引入的一个方便开发者创建带箭头的弹出控制器,类似qq消息页面点击右上角加号弹出的视图. UIPopoverPre ...
- 美团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 ...
随机推荐
- UVA 11651
题目链接:https://cn.vjudge.net/problem/UVA-11651 解题思路: 思路来源于网络. DP + 矩阵快速幂. 设 dp[i][j] 为满足 score 为 i 且最后 ...
- 自动网络搜索(NAS)在语义分割上的应用(二)
前言: 本文将介绍如何基于ProxylessNAS搜索semantic segmentation模型,最终搜索得到的模型结构可在CPU上达到36 fps的测试结果,展示自动网络搜索(NAS)在语义分割 ...
- Xmind写测试点
引入: 既然我们这篇要说<Xmind写测试点>,那么先来回顾一下,什么情况下才写测试点,而不写测试用例. 之前写过一篇<测试用例-20问20答>,没看过的朋友戳这里:,其中就有 ...
- NO.6 ADS1115与MSP432进行I2C通信_运行实例
B站第一次传视频,手机拍摄大家见谅!
- vue中 transition组件使用总结
博客园比较啃爹啊,随笔只能手写,之前写在有道云笔记里面的内容也复制不了,忧伤..... 长话短说,看官方的transition 的讲解,可能是内容太多了,或者就是本人太辣鸡了,看的有点懵逼,但是项目中 ...
- Thunar左侧边栏不完全显示PLACES的解决
场景 我的笔记本装上系统时用的英文,安装中文之后,发现文件管理器的默认的几个文件夹 Desktop.Music.Videos.Downloads等都变成了中文,由于是新安装的系统,就重新生成 loca ...
- 【Ubuntu】Ubuntu中下载特定版本内核和设置某版本内核为默认启动内核
0. 基本命令 uname -a # 查看当前所使用内核 dpkg -l | grep linux # dpkg后是lmn的l.查看当前操作系统的内核 dekg -l | grep linux-ima ...
- 谈谈C#多线程开发:并行、并发与异步编程
阅读导航 一.使用Task 二.并行编程 三.线程同步 四.异步编程模型 五.多线程数据安全 六.异常处理 概述 现代程序开发过程中不可避免会使用到多线程相关的技术,之所以要使用多线程,主要原因或目的 ...
- Rocket - 断句 - Diplomacy and TileLink from the Rocket Chip
https://mp.weixin.qq.com/s/rfgptF9YxDpzDoespYtQvA 整理Diplomacy and TileLink from the Rocket Chip这篇文 ...
- js运算符和if语句,switch语句
逻辑运算符 类型 运算符 算数运算符 + - * / % ++ -- 赋值运算符 = 比较运算符 > < >= <= == != ...