popoverController(iPad)

一、设置尺寸

提示:不建议,像下面这样吧popover的宽度和高度写死。

复制代码
 1 //1.新建一个内容控制器2     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];3     4     //2.新建一个popoverController,并设置其内容控制器5     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];6     7     //3.设置尺寸8     self.popover.popoverContentSize=CGSizeMake(300, 200);9     
10     //4.显示
11     [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
复制代码

更好的设计是:popover的尺寸应该由内部控制器的内容所决定。

从iOS 7开始  @property (nonatomic) CGSize preferredContentSize;

  该属性是UIViewController的

复制代码
 1 -(NSArray *)menus2 {3     if (_menus==nil) {4         _menus=@[@"列表1",@"列表2",@"列表3",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表4",@"列表1",@"列表2",@"列表1",@"列表2"];5     }6  return _menus;7 }8 - (void)viewDidLoad9 {
10     [super viewDidLoad];
11     
12     //设置控制器将来在popover中的尺寸
13     CGFloat maxH=MIN(480,self.menus.count*44);
14     //ios7以前的设置
15 //    self.contentSizeForViewInPopover=CGSizeMake(150, maxH);
16     //ios7以后
17     self.preferredContentSize=CGSizeMake(150, maxH);
18     
19 }
复制代码

效果:

  

关于MIN(A,B)的说明,最终的大小取决于B,但是最大不能超过A,如果超过A那么值就等于A。

 

二、设置显示的位置

1.设置显示的位置有2种方法

(1)围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)

- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;

item :围绕着哪个UIBarButtonItem显示

arrowDirections :箭头的方向

animated :是否通过动画显示出来

 

(2)围绕着某一块特定区域显示(箭头指定那块特定区域)

- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;

rect :指定箭头所指区域的矩形框范围(位置和尺寸),以view的左上角为坐标原点

view :rect参数是以view的左上角为坐标原点(0,0)

arrowDirections :箭头的方向

animated :是否通过动画显示出来

rect和view参数如下:

相关代码:

复制代码
 1 //2 //  YYViewController.m3 //  01-PopoverController简单介绍4 //5 //  Created by apple on 14-8-17.6 //  Copyright (c) 2014年 yangyong. All rights reserved.7 //8 9 #import "YYViewController.h"
10 #import "YYMenuViewController.h"
11 
12 @interface YYViewController ()<UIPopoverControllerDelegate>
13 @property(nonatomic,strong)UIPopoverController *popover;
14 - (IBAction)buttonClick:(UIButton *)sender;
15 @end
16 
17 @implementation YYViewController
18 
19 - (void)viewDidLoad
20 {
21     [super viewDidLoad];
22 }
23 
24 -(void)showPopoverFromItem
25 {
26     //1.新建一个内容控制器
27     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
28     
29     //2.新建一个popoverController,并设置其内容控制器
30     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
31     
32     //3.设置尺寸
33     //    self.popover.popoverContentSize=CGSizeMake(300, 200);
34     
35     //4.显示
36     [self.popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
37     
38     //5.设置代理
39     self.popover.delegate=self;
40 }
41 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
42 {
43     
44 }
45 
46 #pragma mark-代理方法
47 //popoverController消失的时候调用
48 -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
49 {
50 }
51 //popoverController的位置改变的时候调用(如竖屏变横屏)
52 -(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
53 {
54     
55 }
56 //用来决定用户点击了蒙版后,popoverController是否可以dismiss,返回YES代表可以,返回NO代表不可以
57 -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
58 {
59     return NO;
60 }
61 - (IBAction)buttonClick:(UIButton *)sender {
62     
63     //1.新建一个popoverController并设置其内容控制器
64     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];
65     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];
66     
67     //2.显示
68     //2.1第一种方式
69 //    [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>];
70     //2.2第二种方式
71     [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
72     //说明:popover会指向sender.bounds这一块矩形框,这块矩形框以sender的左上角为坐标原点
73     //注意:注意sender.frame和sender.bounds的区别
74     
75 }
76 @end
复制代码

界面效果:(部分)

  

关于frame坐标计算的图示:

      

下面两者是等价的:

  

即如果想让箭头指向某一个UIView的做法有2种做法,比如指向一个button

方法1

  [popover presentPopoverFromRect:button.bounds inView:button permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

方法2

  [popover presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

 

三、设置代理

代理对象

  @property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate;

是否可见

  @property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible;

箭头方向

  @property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection; 

关闭popover(让popover消失)

  - (void)dismissPopoverAnimated:(BOOL)animated;

代码说明:

复制代码
 1   .......2   //5.设置代理3     self.popover.delegate=self;4 }5 6 #pragma mark-代理方法7 //popoverController消失的时候调用8 -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController9 {
10 }
11 //popoverController的位置改变的时候调用(如竖屏变横屏)
12 -(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
13 {
14     
15 }
16 //用来决定用户点击了蒙版后,popoverController是否可以dismiss,返回YES代表可以,返回NO代表不可以
17 -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
18 {
19     return NO;
20 }
复制代码

四、防止点击UIPopoverController区域外消失

默认情况下

只要UIPopoverController显示在屏幕上,UIPopoverController背后的所有控件默认是不能跟用户进行正常交互的

点击UIPopoverController区域外的控件,UIPopoverController默认会消失

 

要想点击UIPopoverController区域外的控件时不让UIPopoverController消失,解决办法是设置passthroughViews属性

@property (nonatomic, copy) NSArray *passthroughViews;

这个属性是设置当UIPopoverController显示出来时,哪些控件可以继续跟用户进行正常交互。这样的话,点击区域外的控件就不会让UIPopoverController消失了

代码示例:

复制代码
 1 - (IBAction)buttonClick:(UIButton *)sender {2     3     //1.新建一个popoverController并设置其内容控制器4     YYMenuViewController *menuVc=[[YYMenuViewController alloc]init];5     self.popover=[[UIPopoverController alloc]initWithContentViewController:menuVc];6     7     //设置过滤掉一些控件8     self.popover.passthroughViews=@[self.switchview];9     
10     //2.显示
11     //2.1第一种方式
12 //    [self.popover presentPopoverFromBarButtonItem:<#(UIBarButtonItem *)#> permittedArrowDirections:<#(UIPopoverArrowDirection)#> animated:<#(BOOL)#>];
13     //2.2第二种方式
14 //    [self.popover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
15     [self.popover presentPopoverFromRect:sender.frame inView:sender.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
16     //说明:popover会指向sender.bounds这一块矩形框,这块矩形框以sender的左上角为坐标原点
17     //注意:注意sender.frame和sender.bounds的区别
18     
19 }
复制代码

补充:

UIPopoverController这个类是只能用在iPad中的

要想在iPhone中实现popover效果,必须得自定义view,可以参考

http://code4app.com/ios/Popover-View-in-iPhone/4fa931bd06f6e78d0f000000

http://code4app.com/ios/Popup-Menu/512231ac6803fa9e08000000

转载于:https://www.cnblogs.com/yintingting/p/4955899.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastQC

Fastqc用途 FastQC aims to provide a simple way to do some quality control checks on raw sequence data coming from high throughput sequencing pipelines. It provides a modular set of analyses which you can use to give a quick impression of whether your data …

C++ Handle(句柄) part1

本文是我学习C&#xff0b;&#xff0b;沉思录第6章的笔记 本文主要讲述了Handle类的概念&#xff0c;定义方法以及写时复制技术。 在前文(Surrogate代理类)的讲解中我们了解到了代理的实现方法. 代理类有很多好处,但是麻烦的是每次都得进行复制.如果该类是经常使用并且member很…

Swift调用Objective C的FrameWork

很多Github的库经过很多年的发展&#xff0c;源码都是OC写的&#xff0c;&#xff0c;所以&#xff0c;用Swift调用OC的库就是开发中难免遇到的的一个问题&#xff0c;本文以AFNetworking为例&#xff0c;讲解如何跨语言调用。 第一步 创建一个空的工程 注意&#xff0c;语言选…

显式(静态)调用: LIB + DLL + .H

1、编程时用ad.h,ad.lib,放在项目当前目录里2、在头文件中加入#include "ad.h"3、在Project Setting–>Link–>Object/library modules加入ad.lib执行时将ad.dll跟你的程序放在同一目录。 就可以直接调用dll中的函数了 当前目录 转载于:https://www.cnblogs.co…

接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误

上次在接入支付宝的时候就碰到了交易订单处理失败&#xff0c;请稍后再试&#xff08;ALI64&#xff09;这样的错误&#xff0c;后来经过排查和总结&#xff0c;一般来讲这种问题都是公钥和私钥没有正确配置造成的。支付宝这边为了保证数据在传输时不被篡改&#xff0c;使用了r…

支付宝集成交互流程

交互流程 功能流程 流程说明&#xff08;以Android平台为例&#xff09;&#xff1a; 第4步&#xff1a;调用支付接口&#xff1a;此消息就是本接口所描述的开发包提供的支付对象PayTask&#xff0c;将商户签名后的订单信息传进pay方法唤起支付宝收银台&#xff0c;订单格式具体…

VxLAN基础

转自&#xff1a;http://blog.csdn.net/freezgw1985/article/details/16354897 一 . 为什么需要Vxlan1. vlan的数量限制4096个vlan远不能满足大规模云计算数据中心的需求2. 物理网络基础设施的限制基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署3. TOR交换机MA…

C语言程序代码优化

我认为一个好的用于科学计算的程序代码应该&#xff1a;算法漂亮精妙&#xff0c;程序简洁易懂&#xff0c;运算快速&#xff0c;节省内存。这里有的地方是矛盾的&#xff0c;比如简洁vs易懂&#xff0c;时间vs空间&#xff0c;找个平衡吧。目前来看时间要比空间宝贵一些。写程…

如何在苹果官网下载旧版本的Xcode 方法

1 在百度里输入“苹果开发者中心“&#xff0c;进入以下页面。点击页面中的“Member Center" 2 出现登录界面。这是需要苹果开发者帐号的&#xff0c;没有帐号的可以选择“Create Apple ID”进行注册。已经注册的选择“Sign In"登录 3 页面跳转后&#xff0c;选择…

【转】android多分辨率适配

前一阶段开发android项目&#xff0c;由于客户要求进行多分辨率适配&#xff0c;能够支持国内主流的分辨率手机。因此经过了几次开发走了很多弯路&#xff0c;目前刚刚领略了android多分辨率适配的一些方法。 先介绍一下所走的弯路&#xff0c;由于android的布局文件存放在res的…

Java线程池介绍

根据摩尔定律&#xff08;Moore’s law&#xff09;&#xff0c;集成电路晶体管的数量差不多每两年就会翻一倍。但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长。处理器制造商花了很多年来提高时钟频率和指令并行。在新一代的处理器上&#xff0c;单线程程序的执…

cocoa pods的安装与我遇到的问题

1.打开终端 终端输入 ruby -v 查看ruby的版本 打印代码&#xff1a; ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] 2. 更换ruby镜像 终端输入如下命令&#xff08;把Ruby镜像指向taobao&#xff0c;避免被墙&#xff0c;你懂得&#xff09; a.移…

Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99

一般出现该问题是因为通过C调用了unix/linux 底层接口&#xff0c;所以需要调整c语言的编译选项&#xff0c;设置方法见下图&#xff1a;(根据实际情况选择相应的编译选项)

DebugView 调试入门

参考链接&#xff1a;http://blog.csdn.net/jiankunking/article/details/44984487 软件下载地址&#xff1a;点击打开链接 debugview 可以捕获程序中由TRACE(debug版本)和OutputDebugString输出的信息。支持Debug、Release模式编译的程序&#xff08;即该软件捕获的是exe直接运…

DebugView使用笔记

1. 什么是DebugView? 它是Sysinternals公司的系列调试工具。可以捕获程序中由TRACE()和OutputDebugString输出的信息。 2. C需要完成哪些工作呢&#xff1f; 将打印的信息用OutputDebugString输出&#xff0c;示例&#xff1a; [cpp] view plaincopy #include "stdio.h&q…

QT之深入理解QThread

QT之深入理解QThread 理解QThread之前需要了解下QThread类&#xff0c;QThread拥有的资源如下&#xff08;摘录于QT 5.1 帮助文档&#xff09;&#xff1a;在以上资源中&#xff0c;本文重点关注槽&#xff1a;start()&#xff1b;信号&#xff1a;started()、finished()&#…

springMVC数据封装成POJO

springMVC把前台的数据封装为POJO与struts2的封装形式不同。struts2需要在控制器声明需封装的POJO&#xff0c;而springMVC不需要任何准备工作&#xff0c;只需在相应的方法的参数中加上需封装的POJO&#xff0c;当用户提交表单时&#xff0c;springMVC会根据表单中dom元素的na…

10.11 安装pod

原文地址&#xff1a;http://www.jianshu.com/p/5fc15906c53a 感谢。 更新升级10.11 cocoapods安装出问题最简单的解决方法 这是因为10.11把cocoapods直接干掉了 sudo gem install -n /usr/local/bin cocoapods 再加一句&#xff0c;完美解决 sudo xcode-select --switch /App…

JavaScript中的原型继承原理

在JavaScript当中&#xff0c;对象A如果要继承对象B的属性和方法&#xff0c;那么只要将对象B放到对象A的原型链上即可。而某个对象的原型链&#xff0c;就是由该对象开始&#xff0c;通过__proto__属性连接起来的一串对象。__proto__属性是JavaScript对象中的内部属性&#xf…

建模元件有哪些在MapleSim中

信号库&#xff1a;包含通用信号模块、布尔、控制器、离散信号模块、信号源、线性信号模块、非线性信号模块、时间离散信号模块、查询表、信号转换器、数学运算、关系元件、特殊信号模块&#xff0c;应用案例。 电子库&#xff1a;包含电阻、运算放大器、二极管、步进电机、模拟…