开发过iPad的同学知道UIPopoverController
,这个可是针对iPad的专用API如果使用在iPhone大多数会报错误。在AutoLayout的带领下,苹果所有界面在走向统一化,一些API也开始统一,UIPopoverPresentationController
就是这样的一个东东。
UIPopoverPresentationController
继承UIPresentationController
,是IOS8新引用的一个类,thanks god,苹果推出了IOS9后设备的迁移近40%,放弃IOS7的同学们可以试试这个类了。
以前如果在iPhone上做一个popOver的效果是比较费力的,如果一套UI Code想适配iPhone和iPad在popOver上估计你得这么写
if(is_iPad){
UIPopoverController ....
}else{
[self presentController...]
}
但是有了UIPopoverPresentationController
后我们就也可以在iPhone来用了。
看一个iPhone上面的效果
这个和iPad上的效果是一样一样的。现在我们可以这么做,先用storyboard实现一下
我们到红色的vc控制器中配置要显示的效果,默认的如果什么都不做在iPad上会popover出来,但是在iPhone上会以presentModel的方式被呈现出来,现在我们配置这个视图让它以popover的方式弹出来
- (void)configPopover{
self.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popvc = self.popoverPresentationController;
popvc.delegate = self;
}
//以下是对UIPopoverPresentationControllerDelegate的实现
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection{
return UIModalPresentationNone;
}
- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
return YES;
}
注意两点
- configPopover需要在视图加载前就做执行,可以放到initWithCoder中
- 第一个代理是
UIPresentationControllerDelegate
的代理,这里面传递了UITraitCollection
,可以根据方向选择,第二个代理可以配置是否要在点视图以外的地方来dissmiss视图。
如果是纯code的话可以这么写
UIViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"byCode"];
if (vc) {
vc.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popvc = vc.popoverPresentationController;
popvc.permittedArrowDirections = UIPopoverArrowDirectionAny;
popvc.barButtonItem = sender;
popvc.delegate = self;
[self presentViewController:vc animated:YES completion:nil];
}
UIPopoverPresentationController
如果要要弹出需要有一个锚点,可以看它的属性里面有sourceRect,sourceView 均可用来popup视图。
对于一些简单的视图你可以做的很小,可以通过preferredContentSize
设置要弹出的view的大小,比如上面的需要添加一句
vc.preferredContentSize = CGSizeMake(200, 200);
,popup出来的view就是一个小方块。
总结一下
- 获取要弹出的ViewController,设置他的要弹出的方式
- 设置弹出的方向,位置,大小
- 如果想控制默认显示方式,需要实现ViewController的popoverPresentationController的代理
- 使用
presentViewController
方法弹出