我们先来看一下效果吧:

popover带箭头弹框-LMLPHP

分析:这个带箭头的弹框其实是一个控制器,通过Modal方式展现,但跟传统模态方式效果不一样,我们一眼就能看出。

Xib方式实现popover:

1、segue的时候选择Present As Popover

popover带箭头弹框-LMLPHP

2、我们看下segue的属性:

popover带箭头弹框-LMLPHP

3、重写prepareforsegue方法:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// 1、判断跳转控制器的类型
if segue.destination.isKind(of: YSSportMapModeVC.self){ // 2、验证popover和传统模态之间的区别
// 只有为popover时,popoverPresentationController有值,否则为nil
// print(segue.destination.popoverPresentationController!) let vc:YSSportMapModeVC = segue.destination as! YSSportMapModeVC // 3、设置代理
vc.popoverPresentationController?.delegate = self // 4、其实我们展现的还是segue.destination,popoverPresentationController只是用来设置展现效果的
// 设置展现的控制器的大小,如果width=0,宽度交给系统设置
vc.preferredContentSize = CGSize(width: , height: ) // 5、设置地图视图的显示模式
vc.didSelectedMapMode = {(mapType:MAMapType) in
self.mapView.mapType = mapType
} // 6、设置vc的当前显示模式
vc.currentMapType = mapView.mapType
}
}

4、实现代理方法:

 // MARK: - UIPopoverPresentationControllerDelegate
extension YSSportMapVC:UIPopoverPresentationControllerDelegate{
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
// 不让系统自适应
return .none
}
}

代码方式实现popover:

 #import "ViewController.h"

 @interface ViewController () <UIPopoverPresentationControllerDelegate>

 // 通过xib设置的按钮,传统模态展现
@property (weak, nonatomic) IBOutlet UIButton *demoButton; @end @implementation ViewController /**
1. 添加加号按钮
2. 点击加号按钮以popover的方式`展现`一个视图控制器
*/
- (void)viewDidLoad {
[super viewDidLoad]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.center = self.view.center; [self.view addSubview:btn]; [btn addTarget:self action:@selector(popover:) forControlEvents:UIControlEventTouchUpInside];
} - (void)popover:(UIButton *)sender { UIViewController *vc = [UIViewController new]; vc.view.backgroundColor = [UIColor redColor]; // 1. 在 iPhone 上默认是模态展现,设置展现类型为 popover
vc.modalPresentationStyle = UIModalPresentationPopover; // 设置弹窗视图控制器视图的大小
vc.preferredContentSize = CGSizeMake(, ); // 2. 设置展现的代理
vc.popoverPresentationController.delegate = self; // 3. 指定弹窗的定位控件 - 使用代码开发,必须设置定位控件
vc.popoverPresentationController.sourceView = sender; // 4. 设置箭头方向朝上
vc.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; // 5. 设置箭头的位置,原点可以参照某一个控件的尺寸设置,宽高通常用于设置附加的偏移量,通常传入0即可
CGSize size = sender.bounds.size;
vc.popoverPresentationController.sourceRect = CGRectMake(size.width * 0.5, size.height, , ); // 6. 设置绕开控件,注意,同一时间,只能允许模态展现一个控制器
vc.popoverPresentationController.passthroughViews = @[_demoButton]; // 展现控制器
[self presentViewController:vc animated:YES completion:nil];
} - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
// 不使用系统默认的展现样式!
return UIModalPresentationNone;
} @end
04-30 13:14