模態彈出窗控制器:UIPopoverPresentationController
實質:就是將內容控制器包裝成PopoverPresentationController的形式,然后再模態出來,必須指定來源視圖及其frame區域,也即指向誰。
功能:它也是一個彈出窗控制器,它在iOS8中替代了UIPopoverController,它在功能上與舊的controller完全等同,並且新增了一些內置的適配特性,可以自動適配iPad與iPhone。當然它也需要一個繼承於UIViewController的控制器作為內容控制器,然后模態它的窗口,即顯示彈出窗。
枚舉:模態顯示類型
typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
UIModalPresentationFullScreen = 0,
UIModalPresentationPageSheet ,
UIModalPresentationFormSheet ,
UIModalPresentationCurrentContext ,
UIModalPresentationCustom ,
UIModalPresentationOverFullScreen ,
UIModalPresentationOverCurrentContext ,
UIModalPresentationPopover , //模態顯示彈出窗
UIModalPresentationNone = -1,
};
模態彈出窗控制器介紹:
@interface UIPopoverPresentationController : UIPresentationController
屬性:
//模態彈出窗控制器代理
@property (nonatomic, assign) id <UIPopoverPresentationControllerDelegate> delegate;
//彈出窗箭頭方向
@property (nonatomic, assign) UIPopoverArrowDirection permittedArrowDirections;
//彈出窗顯示的視圖資源
@property (nonatomic, retain) UIView *sourceView;
//彈出窗顯示的區域
@property (nonatomic, assign) CGRect sourceRect;
//工具條按鈕
@property (nonatomic, retain) UIBarButtonItem *barButtonItem;
//彈出窗箭頭方向(只讀)
@property (nonatomic, readonly) UIPopoverArrowDirection arrowDirection;
//過濾視圖控件,設置不可與用戶做交互
@property (nonatomic, copy) NSArray *passthroughViews;
//彈出窗背景顏色
@property (nonatomic, copy) UIColor *backgroundColor;
//彈出窗偏移位置
@property (nonatomic, readwrite) UIEdgeInsets popoverLayoutMargins;
//彈出窗背景視圖的類
@property (nonatomic, readwrite, retain) Class <UIPopoverBackgroundViewMethods> popoverBackgroundViewClass;
@end
協議:
@protocol UIPopoverPresentationControllerDelegate
@optional
//模態彈出窗窗口時觸發的方法,可以進行數據傳輸
- (void)prepareForPopoverPresentation:(UIPopoverPresentationController*)popoverPresentationController;
//將要關閉彈出窗窗口時觸發的方法
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController*)popoverPresentationController;
//已經關閉彈出窗窗口時觸發的方法
- (void)popoverPresentationControllerDidDismissPopover (UIPopoverPresentationController*) popoverPresentationController;
//彈出窗將要復位到指定視圖區域時觸發的方法
- (void)popoverPresentationController:(UIPopoverPresentationController*)popoverPresentationController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView**)view;
@end
視圖控制器類
@interface UIViewController
//設置內容控制器大小
@property (nonatomic) CGSize preferredContentSize
//模態顯示類型
@property(nonatomic,assign) UIModalPresentationStyle modalPresentationStyle
@end
視圖控制器分類(適配顯示)
@interface UIViewController (UIAdaptivePresentations)
//管理模態窗口的顯示控制器(presentingViewController、presentedViewController)
@property (nonatomic,readonly) UIPresentationController *presentationController;
//模態彈出窗控制器
@property (nonatomic,readonly) UIPopoverPresentationController *popoverPresentationController ;
@end
演示實例如下:
1.創建一個繼承自UIViewController的內容控制器ContentViewController:
2.需要的文件截圖為:
3.在內容控制器ContentViewController.m文件中設置模態彈出窗的大小和背景顏色
- (void)viewDidLoad { [super viewDidLoad]; //設置內容區域大小 self.preferredContentSize = CGSizeMake(100, 200); //設置內容背景顏色 self.view.backgroundColor = [UIColor blueColor]; }
4.在ViewController.m文件中操作的代碼如下:
//聲明必要的屬性
@interface ViewController () @property (strong,nonatomic)UIPopoverPresentationController *popoverPresentVC;//聲明模態彈出窗控制器 @property (strong,nonatomic)UIPopoverController *popoverVC; //聲明彈出窗控制器 @property (strong,nonatomic)ContentViewController *contentVC; //聲明內容控制器 @end
//創建按鈕,並添加按鈕事件,用來打開模態彈出窗
//創建按鈕 UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 40, 40)]; //設置按鈕背景顏色 button.backgroundColor = [UIColor purpleColor]; //設置按鈕標題 [button setTitle:@"打開" forState:UIControlStateNormal]; //添加按鈕事件 [button addTarget:self action:@selector(Open:) forControlEvents:UIControlEventTouchUpInside]; //將按鈕添加到視圖中 [self.view addSubview:button];
//實現按鈕事件
#pragma mark -打開彈窗(將內容控制器以模態窗口的形式打開和關閉) -(void)Open:(UIButton *)sender { if (!self.popoverVC.isPopoverVisible) { //創建內容控制器 self.contentVC = [[ContentViewController alloc]init]; //設置內容控制器模態顯示類型為模態彈出窗 self.contentVC.modalPresentationStyle = UIModalPresentationPopover; //創建popoverPresentVC模態彈出窗控制器,包裝內容控制器 self.popoverPresentVC = self.contentVC.popoverPresentationController; //設置一直顯示后,即使點擊按鈕,此時彈窗也關閉不了,所以不這么設置 //[self.popoverPresentVC setPassthroughViews:@[self.view,sender]]; //設置模態彈窗的顯示區域 self.popoverPresentVC.sourceView = sender; self.popoverPresentVC.sourceRect = sender.bounds; //設置箭頭方向自適應 self.popoverPresentVC.permittedArrowDirections = UIPopoverArrowDirectionAny; //打開模態窗口 [self presentViewController:self.contentVC animated:YES completion:nil]; } else { //關閉模態彈窗 [self.contentVC dismissViewControllerAnimated:YES completion:nil]; } }
演示結果截圖:
開始時: 點擊按鈕時,模態出內容彈出窗:
在點擊屏幕中任何一處時,都可以關閉模態的彈出窗: