我们先来看一下效果吧:

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

Xib方式实现popover:

1、segue的时候选择Present As Popover

2、我们看下segue的属性:

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

popover带箭头弹框的更多相关文章

  1. div+css实现圆形div以及带箭头提示框效果

    .img{ width:90px; height:90px; border-radius:45px; margin:0 40%; border:solid rgb(100,100,100) 1px;& ...

  2. div+css制作带箭头提示框效果图(原创文章)

    一直都在看站友们的作品,今天也来给大家分享一个小的效果,第一次发还有点小紧张呢,语言表达能力不是很好,还请见谅…^ 先来个简单点的吧,上效果图 刚开始在网上看到效果图的时候感觉好神奇,当我试着写出来的 ...

  3. 使用Bootstrap Popover实现一个弹框上三角形的代码记录

          $(function () {        var options = {          trigger: 'manual',          content: function ...

  4. 圆角带箭头的提示框css实现

    css是一个很强大的东西,很多网页效果,我们可以通过css直接实现.今天给大家分享的是一个用css实现的圆角带箭头的提示框. 效果如下图: 这一个样式主要涉及到了css的边框样式border的运用和定 ...

  5. iOS 带箭头菜单选项弹窗LFPopupMenu

    一.效果图 由于是模拟器缩得比较小,一些细线可能显示不出来,不是bug哈. 二.用法 LFPopupMenuItem *item1 = [LFPopupMenuItem createWithTitle ...

  6. 考拉Android统一弹框

    作者:钱成杰 背景 在快速开发的背景下,经历了n个版本后的考拉Android App中已经存在了各种各样看似相同却各有差别的弹框样式.其中包括系统弹框和自定义弹框,并且在线上时常会出现IllegalA ...

  7. 参考bootstrap中的popover.js的css画消息弹框

    前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...

  8. 使用纯CSS实现带箭头的提示框

    爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6187323.html 1.全部代码 <!DOCTYPE html> < ...

  9. iOS 新浪微博-2.0 搜索框/标题带箭头/下拉菜单

    不管是搜索框还是下拉菜单,我们都需要对背景的图片进行拉伸.定义一个Category分类对图片进行操作. UIImage+Effect.h #import <UIKit/UIKit.h> @ ...

随机推荐

  1. Math.ceil(a/b)结果出错--原因是a和b不是double

    脑袋短路.连续测试几次发现Math.ceil(188/20)==9; 忍无可忍,突然发现是int问题,顺着表达式走一遍,188/20==9,然后再向上取整.脑袋僵化了.看来一直做简单的不动脑筋的工作, ...

  2. SQL Server数字辅助表的实现

        数字辅助表是一个连续整数的数列,通常用来实现多种不同的查询任务.大多分两类:足够大物理数字表和表函数,前者可以称为静态的,后者可以称为动态且按需生产. 物理数字表     物理数字表通常存在一 ...

  3. 浅谈 block(1) – clang 改写后的 block 结构

    这几天为了巩固知识,从 iOS 的各个知识点开始学习,希望自己对每一个知识理解的更加深入的了解.这次来分享一下 block 的学习笔记. block 简介 block 被当做扩展特性而被加入 GCC ...

  4. 【转载】8天学通MongoDB——第八天 驱动实践

    作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者, 因为提供了丰富的linq操作,相当方便. 官方驱动:https://gi ...

  5. jQuery uploadify在谷歌和火狐浏览器下无法上传

    原因: 由于jQuery uploadify是借助flash来实现上传的,每一次向后台发送数据流请求时,ie会自动把本地cookie存储捆绑在一起发送给服务器.但firefox.chrome不会这样做 ...

  6. JS数字键盘

    JS数字键盘,JS小键盘 CSS代码: #numberkeyboard { border: 1px solid #b3b3b3; background: #f2f3f7; height: 285px; ...

  7. C#获取执行存储过程的" 返回值"代码

    以下是C#代码: /// <summary> /// 执行存储过程,返回" 返回值" /// </summary> /// <param name=& ...

  8. Windows平台下使用ffmpeg和segmenter实现m3u8直播点播

    1.安装windows media service 实现 流媒体服务器功能   2.windows media编码器 实现 直播推流   3.使用 vlc 将 mms://127.0.0.1/live ...

  9. WCF Throttling 限流的三道闸口

    WCF Throttling 限流的三道闸口 一.WCF Throttling  流量限制简介 我们期望WCF服务端能够处理尽可能多的并发请求,但是资源是有限的,服务不可能同时处理无限多的并发请求,如 ...

  10. C#的变迁史 - C# 3.0篇

    C# 3.0 (.NET 3.5, VS2008) 第三代C#在语法元素基本完备的基础上提供了全新的开发工具和集合数据查询方式,极大的方便了开发. 1. WPF,WCF,WF 这3个工程类型奠定了新一 ...