ios开发-UIPopoverController
2018-07-29 本文已影响0人
不写昵称
简介:
继承于NSObject,用于弹出另外一个控制器(即弹出菜单)
仅仅用于ipad,iphone用不了
ios9以后废弃,由UIModalPresentationPopover和UIPopoverPresentationController代替
相关属性和方法
制定控制器初始化
initWithContentViewController:
指定区域和箭头方向显示弹出框,即给出view的某一块rect,然后箭头出现在这块区域的上/左/下/右的中间。
presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
通过UIBarButtonItem方式显示弹出框
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
隐藏弹出框
- (void)dismissPopoverAnimated:(BOOL)animated;
相关属性
delegate-代理
contentViewController--内容控制器
popoverContentSize--内容控制器大小
popoverVisible--当前弹出框是否处于显示状态
popoverArrowDirection--箭头方向,只读
passthroughViews--指定穿过弹出框蒙版交互的view
backgroundColor--背景色,默认白色
popoverBackgroundViewClass--自定义弹出框背景
代理方法
是否隐藏弹出框
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
弹出框消失后调用,但如果直接使用dismissPopoverAnimated:方法,不会调用
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
屏幕旋转时调用,在显示的情况下,改变位置大小改变时不调用
- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView * __nonnull * __nonnull)view
举例:
- (IBAction)showPopover:(UIButton *)sender {
OneViewController *oneCtr = [[OneViewController alloc] init];
//设置这个后,popoverContentSize将无效
//oneCtr.preferredContentSize = CGSizeMake(200, 200);
//初始化
popoverCtr = [[UIPopoverController alloc] initWithContentViewController: oneCtr];
//设置弹出框大小,不设置时系统会自动调整
popoverCtr.popoverContentSize = CGSizeMake(100, 300);
//能穿透弹出框进行交互的view,默认没有。此处弹出框显示的情况下,hiddenBtn仍能触发
popoverCtr.passthroughViews = @[self.hiddenBtn];
//设置背景色,包括了箭头的颜色,默认白色
//popoverCtr.backgroundColor = [UIColor clearColor];
//popoverCtr.popoverLayoutMargins = UIEdgeInsetsMake(100, 100, 100, 100);
//自定义背景view,需要重写多个方法。
//popoverCtr.popoverBackgroundViewClass = [CustomPopoverBackgroundView class];
//代理
popoverCtr.delegate = self;
//展示弹出框。即给出view的某一块rect,然后箭头出现在这块区域的上/左/下/右的中间。
[popoverCtr presentPopoverFromRect:self.showBtn.bounds inView:self.showBtn permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"hello world");
}
- (IBAction)hiddePopover:(UIButton *)sender {
//隐藏弹出框,在弹出框外点击,如果没有穿透的view,弹出框也会消失
//[popoverCtr dismissPopoverAnimated:YES];
//在弹出框显示的情况下,可以改变与它关联的控制器和大小。如果弹出框已经消失,执行以下方法会崩溃
TwoViewController *twoCtr = [[TwoViewController alloc] init];
popoverCtr.contentViewController = twoCtr;
popoverCtr.popoverContentSize = CGSizeMake(200, 200);
}
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController {
NSLog(@"是否隐藏弹出框");
return YES;
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
NSLog(@"弹出框消失后调用,但如果直接使用dismissPopoverAnimated:方法,不会调用");
}
- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing _Nonnull *)view {
NSLog(@"屏幕旋转时调用,在显示的情况下,改变位置大小改变时不调用");
}