iOS:弹出窗控制器:UIPopoverController

弹出窗控制器:UIPopoverController

截图:

功能:它是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];

        //创建popoverVC
        self.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,此时,仅有按钮能与用户交互,点击可以关闭弹出窗,点击其他区域没有任何效果)

时间: 2024-08-11 05:36:27

iOS:弹出窗控制器:UIPopoverController的相关文章

IOS 弹出式 POPMenuView

//MenuView.h // //  MenuView.h //  RockPopMenu // //  Created by zhuang chaoxiao on 14-6-26. //  Copyright (c) 2014年 zhuang chaoxiao. All rights reserved. // #import <UIKit/UIKit.h> @protocol MenuViewDelegate @optional @end @interface MenuView : UIV

DuiVision开发教程(18)-弹出窗

DuiVision的弹出窗口类CDlgPopup,是菜单.下拉列表等控件的父类,也可以单独使用,用于创建弹出窗口,弹出窗口默认是非激活状态下自动关闭,例如鼠标点击到弹出窗口外面的区域,弹出窗口就会自动关闭,也可以设置为不自动关闭. 通用的弹出窗口一般通过对话框的OpenDlgPopup函数创建. 弹出窗的属性说明如下: 属性名 类型 说明 width 数字 窗口宽度 height 数字 窗口高度 bkimg 字符串 窗口的背景图片,如果指定了就使用指定的背景图片,否则使用全局设置的背景图片 bk

Android应用之——百度地图最新SDK3.0应用,实现最常用的标注覆盖物以及弹出窗覆盖物

一.概述 最新版的百度地图SDK3.0,修改了很多方法,之前的很多方法被简化了,正好在做地图这一块,顺便就使用了最新版的sdk. 下载官方给的demo,发现变化还是挺大的,之前的一些方法都换了,地图的初始化也进行了调整.多了好几个类,具体用法参考下面的例子,详细的说明可参照官方的说明文档. 二.效果图 标注覆盖物效果图: 弹出窗覆盖物: 三.实现过程 大部分是根据官方给的demo来的. A.配置文件: 第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷

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

除了通过data-toggle和data-target来控制模态弹出窗之外,Bootstrap框架针对模态弹出框还提供了其他自定义data-属性,来控制模态弹出窗.比如说:是否有灰色背景modal-backdrop,是否可以按ESC键关闭模态弹出窗.有关于Modal弹出窗自定义属性相关说明如下所示: JavaScript触发时的参数设置 $(function(){ $(".btn").click(function(){ $("#mymodal").modal({ b

jquery Mobile弹出窗

先创建一个窗体 <div data-role="popup" id="popupView" class="ui-content" data-overlay-theme="b" data-position-to="window" data-dismissible="false"> <a href='javascript:void(0)' data-rel="ba

Bootstarp学习(二十四)模态弹出框--模态弹出窗的使用

除了通过data-toggle和data-target来控制模态弹出窗之外,Bootstrap框架针对模态弹出框还提供了其他自定义data-属性,来控制模态弹出窗.比如说:是否有灰色背景modal-backdrop,是否可以按ESC键关闭模态弹出窗.有关于Modal弹出窗自定义属性相关说明如下所示: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content=&qu

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

IOS弹出视图 LewPopupViewController

LewPopupViewController是一款IOS弹出视图软件.iOS 下的弹出视图.支持iPhone/iPad. 软件截图 使用方法 弹出视图 1 2 3 4 5 PopupView *view = [PopupView defaultPopupView]; view.parentVC = self; [self lew_presentPopupView:view animation:[LewPopupViewAnimationFade new] dismissed:^{ NSLog(@

jQueryMobile的组件之弹出窗(popup)

data-rel="popup"--设置当前元素具有弹出窗的功能: data-role="popup"--设置当前元素为弹出窗: data-position-to="window"--设置弹出窗出现在窗口中间位置: data-transition="fade"--设置弹出窗出现的效果: <!DOCTYPE html> <html> <head lang="en"> <