描述
在iPad中,UIPopoverController可以说比较常见,比如点击某个按钮,会弹出一个带箭头的View,可以在View上进行操作,点击View的其他领域,View消失。
使用
UIPopoverController的使用至少有如下 4 步:
//第一步:通过一个UIViewController初始化一个UIPopoverController,其中exportViewCon是已经定义好的UIViewController
UIPopoverController *popPreCon = [[UIPopoverController alloc] initWithContentViewController:exportViewCon];
//第二步:指定UIPopoverController的视图大小
popPreCon.popoverContentSize = CGSizeMake(320, 506);
//第三步:指定唤起UIPopoverController的UIBarButton以及UIPopoverController的箭头方向
//第四步:展示出来
[popPreCon presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
细节
当然,UIPopoverController也有其他的一些属性,包括一个UIPopoverControllerDelegate,详见链接:UIPopoverController。然而当你打开后你会发现,TMD都是划横线了(被苹果舍弃了)!!
原因是因为上面的代码只能在iPad上面运行,但是如果想要在iPhone上面也运行,就需要使用下面的方式:
iOS8 新特性
UIPopoverPresentController和UIModelPresentationPopover
//示例代码
//第一步:初始化UIViewController
ExportViewController *exportViewCon = [[ExportViewController alloc] init];
//第二步:将UIViewController封装成为Popover
exportViewCon.modalPresentationStyle = UIModalPresentationPopover;
//第三步:设置popoverPresentationController的button or barbtton
exportViewCon.popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem;
//第四步:设置popover的size
exportViewCon.preferredContentSize = CGSizeMake(320, 506);
//第五步:展示出来
[self presentViewController:exportViewCon animated:YES completion:nil];
UIViewController弹出模态
原来的UIPopoverController继承自UIViewController,实现需要用UIPopoverController去封装需要展现的UIViewController。
现在UIViewController变得更加强大,只需要更改一下弹出模态的style就能够有相应的效果:
UIModalPresentationStyle展现的形态
UIModalPresentationStyle | 效果 |
---|---|
UIModalPresentationFullScreen | 全屏,portrait和landscape一样 |
UIModalPresentationPageSheet | landscape非全屏两边会有暗色留空,portrait则全屏 |
UIModalPresentationFormSheet | 非全屏,四周会有暗色留空 |
UIModalPresentationCurrentContext | 与父辈Controller一致 |
UIModalPresentationCustom | 自定义模式 |
UIModalPresentationOverFullScreen | 与非Over的区别在于底层的Views并不会被remove,因此如果ViewController没有全覆盖,底层的Views会透出来 |
UIModalPresentationOverCurrentContext | UIKit会查找哪个UIViewController的definesPresentationContext是YES,就用哪个作为style,Over效果同FullScreen效果一样,如果在popover上弹出视图,一定要用CoverVertical效果,否则异常 |
UIModalPresentationPopover | 就是Popover啦 |
UIModalPresentationNone | 一般不用该style,但是可以adaptivePresentationStyleForPresentationController: 方法返回该字段实现与之前不同的弹出模态 |
UIModalTransitionStyle弹出的效果
UIModalTransitionStyle | 效果 |
---|---|
UIModalTransitionStyleCoverVertical | 从底下滑出来,从底下滑出去 |
UIModalTransitionStyleFlipHorizontal | 从右边滑出来,从右边滑出去 |
UIModalTransitionStyleCrossDissolve | 渐变出来与消失 |
UIModalTransitionStylePartialCurl | 类似于翻书效果,一般父辈Controller要用FullScreen模式,否则异常 |
//弹出Controller,此时self是父辈Controller
[self presentViewController:exportViewCon animated:YES completion:nil];
//销毁Controller此时self是弹出的Controller
[self dismissViewControllerAnimated:YES completion:nil];
参考文章:http://blog.csdn.net/james_1010/article/details/8845830