弹出窗控制器:UIPopoverController

截图:

实质:就是将内容控制器包装成popoverController的形式,然后在模态出来,必须给定指向目标(target、frame)。
 
功能:它是ipd特有的特性,不适用iphone,用来点击一个按钮时,弹出一个窗口以显示一些信息。
如果没有使用passthroughViews属性设置过滤控件,那么点击屏幕的任意区域都可以关闭弹出窗;可是,如果设置了passthroughViews属性过滤了按钮的父视图和显示区域控件,那么点击屏幕任何区域都是无效的,只有点击按钮才会与用户发生交互。
介绍:它是直接继承自NSObject的控件,并不是UIViewController的子类,所以,它不具备可视化的条件。可是,既然它是弹出窗,就必须具有可视效果,如何实现呢?其实,它是通过创建第三方控制器来实现的,即内容控制器,该控制器继承于UIViewController,将其设置为UIPopoverController的内容控制器即可。
设置内容的尺寸有2种方法:
方法一:
@property (nonatomic) CGSize popoverContentSize;

- (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;

以上方法和属性都是UIPopoverController的

方法二:
内容控制器可以自行设置自己在popover中显示的尺寸
p在iOS 7之前

@property (nonatomic,readwrite) CGSize contentSizeForViewInPopover;

从iOS 7开始

@property (nonatomic) CGSize preferredContentSize;

以上属性都是UIViewController的

 
类介绍:
箭头方向枚举:

typedef NS_OPTIONS(NSUInteger, UIPopoverArrowDirection) {

UIPopoverArrowDirectionUp = 1UL << 0,     //箭头往上指向按钮

UIPopoverArrowDirectionDown = 1UL << 1, //箭头往下指向按钮

UIPopoverArrowDirectionLeft = 1UL << 2,  //箭头往左指向按钮

UIPopoverArrowDirectionRight = 1UL << 3, //箭头往右指向按钮

UIPopoverArrowDirectionAny = UIPopoverArrowDirectionUp | UIPopoverArrowDirectionDown | UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight,  //箭头方向自适应

UIPopoverArrowDirectionUnknown = NSUIntegerMax  //箭头方向未知

};

@interface UIPopoverController : NSObject <UIAppearanceContainer>

属性:

//弹出框控制器代理

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

//内容控制器

@property (nonatomic, retain) UIViewController *contentViewController;

//弹出窗是否可见的(只读属性)

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

//弹出窗的箭头方向

@property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection;

//过滤视图控件,即该数组中视图不可以与用户进行交互,但是其他区域的控件是可以的,一般选择按钮本身

@property (nonatomic, copy) NSArray *passthroughViews;

//弹出窗中内容区域大小

@property (nonatomic) CGSize popoverContentSize;

//弹出窗背景颜色

@property (nonatomic, copy) UIColor *backgroundColor ;

//弹出窗偏移布局

@property (nonatomic, readwrite) UIEdgeInsets popoverLayoutMargins ;

//弹出窗后台视图类

@property (nonatomic, readwrite, retain) Class popoverBackgroundViewClass;

方法:

//创建弹出窗控制器实例,内容控制器为参数

- (instancetype)initWithContentViewController:(UIViewController *)viewController;

//设置弹出窗控制器的内容控制器

- (void)setContentViewController:(UIViewController *)viewController animated:(BOOL)animated;

//设置弹出窗内容区域的大小

- (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;

//弹出窗围绕着某一块特定区域显示(箭头指定那块特定区域)

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

//弹出窗围绕着一个UIBarButtonItem显示(箭头指定那个UIBarButtonItem)

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

//关闭弹出窗

- (void)dismissPopoverAnimated:(BOOL)animated;

@end

协议:

@protocol UIPopoverControllerDelegate <NSObject>

@optional

//弹出窗将要弹出时触发的方法

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController;

//弹出窗弹出时触发的方法

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController;

//弹出窗将要复位到某一特定区域时触发的方法

- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView **)view;

@end

演示实例如下:

第一种方式:弹出窗围绕着某一块特定区域显示(箭头指定那块特定区域),我使用按钮UIButton作为特定区域。

1.首先创建一个内容控制器ContentViewController,它直接继承自UIViewcontroller

2.所有的文件截图为:

3.在内容控制器ContentViewController.m文件使用UIViewController的preferredContentSize属性设置显示区域大小

#import "ContentViewController.h"
@interface ContentViewController ()
@end@implementation ContentViewController
- (void)viewDidLoad {[super viewDidLoad];//设置视图颜色self.view.backgroundColor = [UIColor redColor];//设置内容控制器显示局域大小self.preferredContentSize = CGSizeMake(100, 200);
}
@end

4.在当前控制器ViewController.m文件中进行主要代码操作:

//声明属性

#import "ViewController.h"
#import "ContentViewController.h"@interface ViewController ()
@property (strong,nonatomic)UIPopoverController *popoverVC;    //声明弹出窗控制器
@property (strong,nonatomic)ContentViewController *contentVC;  //声明内容控制器
@end

//创建UIButton按钮控件,并添加打开弹出窗事件

- (void)viewDidLoad {[super viewDidLoad];//创建按钮UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 40, 40)];//设置按钮标题[button setTitle:@"打开" forState:UIControlStateNormal];//设置按钮背景颜色button.backgroundColor = [UIColor purpleColor];//添加事件,用来打开弹出窗
   [button addTarget:self action:@selector(Open:) forControlEvents:UIControlEventTouchUpInside];//添加按钮到视图中
    [self.view addSubview:button];
}

//实现按钮事件

-(void)Open:(UIButton *)sender
{if (!self.popoverVC.isPopoverVisible){//设置内容控制器self.contentVC = [[ContentViewController alloc]init];//创建UIPopoverController(将当前视图控制器设置为内容控制器)self.popoverVC = [[UIPopoverController alloc]initWithContentViewController:self.contentVC];//设置一直显示区域,此时点击视图和弹出窗与用户不会发生任何交互,只有按钮能与用户交互self.popoverVC.passthroughViews = @[self.view,sender];//打开popoverVC控制器,设置箭头方向为自适应
        [self.popoverVC presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}else{//关闭popoverVC控制器
        [self.popoverVC dismissPopoverAnimated:YES];}
}

//演示结果截图

开始时 :

点击按钮时:(因为设置了passthroughViews,此时,仅有按钮能与用户交互,点击可以关闭弹出窗,点击其他区域没有任何效果)

第二种方式:弹出窗围绕着UIBarButtonItem显示,箭头指定UIBarButtonItem

1.首先创建一个内容控制器ContentViewController,它直接继承自UIViewcontroller

2.所有的文件截图为:

3.在当前控制器ViewController.m文件中进行主要代码操作:

//声明属性

#import "ViewController.h"
#import "ContentViewController.h"@interface ViewController ()
@property (strong,nonatomic)UIPopoverController *popoverVC;  //声明弹出窗控制器
@property (strong,nonatomic)ContentViewController *contentVC;//声明内容控制器
@end

//创建UIBarButtonItem,并添加打开弹出窗事件

- (void)viewDidLoad {[super viewDidLoad];//创建工具栏控件UIToolbar *toolBar = [[UIToolbar alloc]init];toolBar.frame = CGRectMake(0, 0, self.view.frame.size.width,40);//创建工具栏目UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithTitle:@"打开" style:UIBarButtonItemStylePlain target:self action:@selector(Open:)];UIBarButtonItem *fixItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];fixItem.width = 200;//将工具栏目添加到工具栏
    [toolBar setItems:@[fixItem,item]];//将工具栏添加到控制器视图中
    [self.view addSubview:toolBar];
}

//实现按钮事件,其中通过弹出窗的popoverContentSize属性设置弹出窗内容区域的颜色

#pragma mark -打开弹窗
-(void)Open:(UIBarButtonItem *)sender
{if (!self.popoverVC.popoverVisible){//创建内容控制器self.contentVC = [[ContentViewController alloc]init];//创建popoverVCself.popoverVC = [[UIPopoverController alloc]initWithContentViewController:self.contentVC];//设置内容显示区域大小和背景颜色//self.popoverVC.popoverContentSize = CGSizeMake(100, 200);[self.popoverVC setPopoverContentSize:CGSizeMake(100, 200) animated:YES];self.popoverVC.backgroundColor = [UIColor redColor];//设置一直显示的区域,过滤了当前视图和内容区域,此时只有UIBarButtonItem能与用户进行交互self.popoverVC.passthroughViews = @[self.view,sender];//打开弹窗口
        [self.popoverVC presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}else{//关闭弹窗口
        [self.popoverVC dismissPopoverAnimated:YES];}
}

//演示结果截图:

开始时:

点击按钮时:(因为设置了passthroughViews,此时,仅有按钮能与用户交互,点击可以关闭弹出窗,点击其他区域没有任何效果)

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类: iOS高级
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4897146.html,如需转载请自行联系原作者

iOS:弹出窗控制器:UIPopoverController相关推荐

  1. data-参数说明(模态弹出窗的使用)

    除了通过data-toggle和data-target来控制模态弹出窗之外,Bootstrap框架针对模态弹出框还提供了其他自定义data-属性,来控制模态弹出窗.比如说:是否有灰色背景modal-b ...

  2. TabActivity中子Activity相互跳转,及某个Tab需弹出窗的解决方案

    在iphone开发中貌似有个UITabBarController,(我以为是toolbar,四楼的兄弟更正的),UITabBarController在底部,也有对应的切换效果,都封装好了.但是在and ...

  3. 弹出窗弹出两次的原因

    弹出窗弹出两次,点击事件只使用了一次,很有可能是使用匹配绑定事件匹配了两次,所以点击一次出发了两次事件,也就是两个弹窗 转载于:https://www.cnblogs.com/zhengyuanyua ...

  4. easyui弹出窗关闭前调用确认窗口,先关闭页面后调用弹出窗口

    弹出窗关闭的时候提示是否关闭,同时进行一些对应的方法调用, 然而在进行页面关闭调用的时候,往往页面关闭了,才弹出确认对话框, $.messager.confirm和panel的onBeforeClos ...

  5. -webkit-touch-callout: none;禁止ios弹出菜单,长按图片保存到手机时

    -webkit-touch-callout: none;禁止ios弹出菜单,长按图片保存到手机时 有一个需求就是h5页面中,长按二维码图片,保存到手机:在ios上经常长按会弹出ios的菜单,而无法每次 ...

  6. 在sweetalert弹出窗插件中加入html代码

    sweetalert介绍: SweetAlert是一个JavaScript原生插件,不需要jquery支持的,能够完美替代JavaScript自带的alert弹出框,并且功能强大.设计优美.最重要的一 ...

  7. JS实现复制页面文字弹出消息提醒/在sweetalert(swal)弹出窗插件中加入html代码

    简洁版: <script type="text/javascript">document.body.oncopy=function(){alert("复制成功 ...

  8. Android自定义底部弹出窗-dialog(2种实现分析+源码)

    Android自定义底部弹出窗-dialog(2种实现分析+源码) 上线项目功能抽取,在项目开发中,我们会在许多地方会用到底部自定义弹窗,比如设置:个人账户退出,切换,照片的拍照或者相册的调出,或者一 ...

  9. Jquery仿Windows Aero弹出窗

    目前市面上已经有很多成熟好用的jquery弹出窗插件,像模态窗口插件(Modal Dialog Plugins)以及数不胜数的灯箱插件(lightbox plugins). 今天介绍的Jquery D ...

最新文章

  1. 使用 IDEA 解决 Java8 的数据流问题,用过的都说好!!!
  2. O2O产品经理,请多关注屏幕之外
  3. mvn导入jar到库命令
  4. 开源GraphView的使用--数据统计
  5. python爬虫网络出错怎么办_Python爬虫常见问题
  6. 阿里巴巴基于 Nacos 实现环境隔离的实践
  7. php转盘中奖率,PHP大转盘中奖概率算法实例_PHP
  8. 海报设计素材|中国风的插画设计,国画浓抹中国色彩
  9. 用html页面制作开关,利用前端基础制作html开关图标
  10. kali linux 安装驱动安装教程,kali linux安装NVIDA显卡驱动教程
  11. eclipse php 代码补全,phpeclipse代码提示
  12. ROS使用节点句柄nh(“~“)和nh的区别:发布的话题的命名空间不同
  13. 李春葆《数据结构教程》课后习题和实验代码
  14. python网络编程原理_图解Python网络编程
  15. LNMP详解(九)——Nginx虚拟IP实战
  16. win7无法连接虚拟磁盘服务器,win7系统电脑打开磁盘管理出现“无法连接虚拟磁盘服务”的解决方法...
  17. sparc-linux-gcc math.h 调用,无法使用叮进行交叉编译为SPARC
  18. 为什么美国大城市里不修二环三环四环五环?
  19. 三分钟了解如何准备简历面试
  20. 设计模式(一):里氏代换原则

热门文章

  1. python乘法口诀表-用python打印99乘法口诀表
  2. python一次性读取整个文件-python-文件中的行是否读取整个文件
  3. windows命令行帮助文档如何使用
  4. 行为模式之Observer模式
  5. 网络编程学习笔记(gethostbyaddr函数)
  6. 题目1104:整除问题
  7. FFT IP核调用与仿真之SCALE压缩因子设置
  8. Mybatis常用标签使用
  9. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
  10. Offer是否具有法律效力?