让iPhone也能popup的效果

开发过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上面的效果

让iPhone也能popup的效果_第1张图片
Simulator Screen Shot Oct 17, 2015, 2.54.35 PM.png

这个和iPad上的效果是一样一样的。现在我们可以这么做,先用storyboard实现一下

让iPhone也能popup的效果_第2张图片
Untitled.png

我们到红色的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方法弹出

你可能感兴趣的:(让iPhone也能popup的效果)