UIPopoverController是在ios9的时候废弃了,用UIPopverPresentationController来代替,下面就简单的介绍下这两者的使用方式
首先是UIPopiverController它是继承自NSObject的,也就是说它本身没有显示功能,我们肯定要给它去设置内容,所以它是有一个contentViewController属性的。
使用如下所示
- (IBAction)MenuClick:(UIBarButtonItem*)sender {
ZXTableViewController * vc = [[ZXTableViewController alloc]init];
//禁止tableView的滚动
vc.tableView.scrollEnabled=NO;
//创建UIPopoverController
UIPopoverController * popover = [[UIPopoverController alloc]initWithContentViewController:vc];
//设置弹出视图的尺寸
popover.popoverContentSize = CGSizeMake(375, 44*3);
//设置从哪边显示出来,Any表示四个方向都可以,系统帮我们判断
[popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
上面的使用需要注意的是,我们一定要一开始去创建popover的时候,就应该去使用initWithContentViewController,否则程序会崩溃,会报下面的错误。
效果图
如果是UIPopverPresentationController使用起来就不一样了。下面设置代理的话,self需要去遵守<UIPopoverPresentationControllerDelegate>这个协议
- (IBAction)ButtonClick:(UIButton *)sender {
//创建控制器
ZXTableViewController * vc = [[ZXTableViewController alloc]init];
//禁止tableView的滚动
vc.tableView.scrollEnabled=NO;
//设置大小,这个我们也可以在控制器内部设置,让控制器自己决定
vc.preferredContentSize = CGSizeMake(300, 300);
//设置style
vc.modalPresentationStyle = UIModalPresentationPopover;
//设置弹出的参照视图,rect参数是以view的左上角为坐标原点(0,0)
vc.popoverPresentationController.sourceView = sender;
//弹出视图的尖参照视图底部的中间的位置,指定箭头所指区域的矩形框范围(位置和尺寸),以view的左上角为坐标原点
vc.popoverPresentationController.sourceRect = sender.bounds;
//这里就是去设置可以穿透的view,就是当控制器的view已经弹出来了,后面有蒙版了,我们点击后面的某个view是可以点击的,并且这个控制器的view不会消失
vc.popoverPresentationController.passthroughViews=@[self.AlertButton];
//设置弹出视图的箭头方向
vc.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp;
//设置代理
vc.popoverPresentationController.delegate = self;
[self presentViewController:vc animated:YES completion:nil];
}
这里需要注意的是如果我们设置了modalPresentationStyle为UIModalPresentationPopover这样我们去访问这个popoverPresentationController就会去创建出来,否则就为nil
效果如下所示
在扩展下<UIPopoverPresentationControllerDelegate>中比较常用的代理方法
//点击蒙版popover消失, 默认YES
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
return YES;
}
- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
NSLog(@"dismissed");
}
还有一个方法,在ipad下不会调用,在iphone下会调用
//默认弹出覆盖整个屏幕
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
return UIModalPresentationNone;
}
在iphone中的如果让上面的方法返回UIModalPresentationNone,那就会充满屏幕,效果图如下所示
如果我们在iphone下想要上面的这个显示的效果,我们还可以添加一个按钮,让这个按钮可以做到dismiss的操作。那我们就要去重写一个方法
-(UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:
(UIModalPresentationStyle)style
{
UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:controller
.presentedViewController];
UIBarButtonItem * item = [[UIBarButtonItem alloc]initWithTitle:@"完成" style: UIBarButtonItemStyleDone target:self action:
@selector(complete)];
navigationController.topViewController.navigationItem.rightBarButtonItem = item;
return navigationController;
}
-(void)complete
{
[self dismissViewControllerAnimated:YES completion:nil];
}