0. Device选项对运行的影响
通用: iPhone和iPad正常运行
iPad: 只能运行在iPad上
iPhone: 运行在iPad上会出现黑边情况, 而且默认是按照X2的分辨率显示的
Xcode9默认就是通用, 以后也不建议调整
1. SB实现Popover
Popover指向的有两种类型: UIBarButtonItem(箭头位置会自动指向正确的地方) , 自定义View(会出现默认指向不对的情况)
- 如果指向UIBarButtonItem, 只需要连线即可
- 如果指向自定义View, 需要设置rect参数
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UITableViewController *tabelVC = segue.destinationViewController;
//iOS9过期了
//UIPopoverController
//从iOS8开始, UIPopoverPresentationController成为了UIViewController的一个属性.
//通过这个控制器的属性可以设置相关的参数
//UIPopoverPresentationController
UIPopoverPresentationController *popoverC = tabelVC.popoverPresentationController;
//sourceRect: 设置popover指向的位置. 先以sourceView左上角为(0,0)点, 然后根据传入的rect参数值进行位置修正
//固定写法, 传入bounds即可.
popoverC.sourceRect = popoverC.sourceView.bounds;
}
2. 代码实现Popover
#pragma mark - 指向自定义View
- (IBAction)customViewClick:(UIButton *)sender {
//1. 创建NextVC
NextTableViewController *nextVC = [NextTableViewController new];
//2. 设置模态的样式 --> 必须先设置style才能设置属性
nextVC.modalPresentationStyle = UIModalPresentationPopover;
//3. 设置SourceView
nextVC.popoverPresentationController.sourceView = sender;
nextVC.popoverPresentationController.sourceRect = sender.bounds;
//如果是UIBarButtonItem, 需要 设置UIBarButtonItem
//navC.popoverPresentationController.barButtonItem = sender;
//3.1 方向
//系统默认是Any, 自己会查找合适的位置来显示.
nextVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
//3.2 设置能够穿透的视图
nextVC.popoverPresentationController.passthroughViews = @[self.clickMeButton];
//3.3 设置不能点击模态的背景来消失模态视图
nextVC.modalInPopover = YES;
//4. 模态弹出
[self presentViewController:nextVC animated:YES completion:nil];
}
3. 兼容iPhone和iPad
popover: 带有箭头指向的弹窗视图
UIPopoverPresentationController: iOS8出现的, 替代原先的UIPopoverController. 能够保证iPhone使用不崩溃, 但是不会默认的出现popover效果
UIPopoverPresentationController: 增加了自适应逻辑. 系统本身的逻辑:如果检测到设备是iPad,就用popover样式, 如果检测到时iPhone,就用全屏的样式
UIPopoverController: 只能用于iPad, 用于iPhone直接崩溃
//3.4 设置代理
nextVC.popoverPresentationController.delegate = self;
#pragma mark - 代理方法
//从协议中中的父协议中拷贝的第一个方法
//设置自适应的样式 --> 不需要自适应的话, 使用None就取消了
//系统本身的逻辑:如果检测到设备是iPad,就用popover样式, 如果检测到时iPhone,就用全屏的样式
//如果公司有自己的弹窗样式, 就需要自定义
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
}