一、效果图

由于是模拟器缩得比较小,一些细线可能显示不出来,不是bug哈。

二、用法

  1. LFPopupMenuItem *item1 = [LFPopupMenuItem createWithTitle:@"小视频" image:[UIImage imageNamed:@"icon_menu_record_normal"]];
  2. LFPopupMenuItem *item2 = [LFPopupMenuItem createWithTitle:@"拍照" image:[UIImage imageNamed:@"icon_menu_shoot_normal"]];
  3. LFPopupMenuItem *item3 = [LFPopupMenuItem createWithTitle:@"相册" image:[UIImage imageNamed:@"icon_menu_album_normal"]];
  4. self.items = @[item1, item2, item3];
  5.  
  6. LFPopupMenu *menu = [[LFPopupMenu alloc] init];
  7. [menu configWithItems:self.items
  8. action:^(NSInteger index) {
  9. NSLog(@"点击了第%zi个",index);
  10. }];
  11.  
  12. [menu showArrowToView:sender];

更多方法见.h文件,有详细注释

  1. //
  2. // LFPopupMenu.h
  3. // LFPopupMenu
  4. //
  5. // Created by 张林峰 on 2017/8/20.
  6. // Copyright © 2017年 张林峰. All rights reserved.
  7. //
  8.  
  9. #import <UIKit/UIKit.h>
  10.  
  11. typedef NS_ENUM(NSInteger, PopupMenuDirection) {
  12. PopupMenuDirection_Auto, //箭头自动确定朝上还是下
  13. PopupMenuDirection_Up, //箭头朝上
  14. PopupMenuDirection_Down //箭头朝下
  15. };
  16.  
  17. @interface LFPopupMenuItem : NSObject
  18.  
  19. @property (nonatomic, strong) NSString *title;
  20. @property (nonatomic, strong) UIImage *image;
  21.  
  22. /** 生成选项对象,标题和图片至少要传一个参数*/
  23. + (LFPopupMenuItem *)createWithTitle:(NSString *)title image:(UIImage *)image;
  24.  
  25. @end
  26.  
  27. @interface LFPopupMenuConfig : NSObject <NSCopying>
  28.  
  29. @property (nonatomic, assign) CGFloat rowHeight;//行高,默认60
  30. @property (nonatomic, assign) CGFloat arrowH;//箭头形高,默认9
  31. @property (nonatomic, assign) CGFloat arrowW;//箭头形宽,默认9
  32. @property (nonatomic, assign) CGFloat minWidth;//弹窗最小宽度,默认0
  33. @property (nonatomic, assign) CGFloat popupMargin;//窗口距屏幕边缘最小距离,默认5
  34. @property (nonatomic, assign) CGFloat leftEdgeMargin;//左边距窗口的距离,默认16
  35. @property (nonatomic, assign) CGFloat rightEdgeMargin;//右边距窗口的距离,默认16
  36. @property (nonatomic, assign) CGFloat textMargin;//文字距图标的距离,默认8
  37. @property (nonatomic, assign) CGFloat lineMargin;//分割线左边距,默认0
  38. @property (nonatomic, assign) CGFloat cornerRadius;//弹窗圆角,默认6
  39. @property (nonatomic, assign) CGFloat arrowCornerRadius;//箭头的圆角,默认0
  40. @property (nonatomic, strong) UIColor *lineColor;//分割线颜色、边框色,默认系统灰色
  41. @property (nonatomic, strong) UIFont *textFont;//默认15
  42. @property (nonatomic, strong) UIColor *textColor;//默认黑色
  43. @property (nonatomic, strong) UIColor *fillColor;//带箭头框的填充色,默认白色
  44. @property (nonatomic, assign) BOOL needBorder;//是否要边框
  45.  
  46. @end
  47.  
  48. /**
  49. (可选)配置LFPopupMenu默认样式的单例,只需应用启动时配置一次即可
  50. 作用:如果多处使用LFPopupMenu,配置默认样式,就不用繁琐的设置那些属性
  51. */
  52. @interface LFPopupMenuDefaultConfig : NSObject
  53.  
  54. @property (nonatomic, strong) LFPopupMenuConfig *config;
  55.  
  56. + (instancetype)sharedInstance;
  57.  
  58. @end
  59.  
  60. @interface LFPopupMenu : UIView
  61.  
  62. @property (nonatomic, strong) LFPopupMenuConfig *config;
  63. @property (nonatomic, strong) UIView *maskView;//半透明遮罩层,默认透明,可自行设置
  64. @property (nonatomic, strong) UIImage *imgBG;//背景图,设置了这个就不用画带箭头的框了。
  65. @property (nonatomic, assign) CGPoint anchorPoint;//设置背景图的情况使用,背景图的三角在背景图的位置比例,如左上角(0,0),右下角(1,1),下边中间(0.5,1)以此类推
  66. @property (nonatomic, strong) UIView *menuSuperView;//本菜单弹窗的父视图,默认在Window上
  67. @property (nonatomic, assign) PopupMenuDirection direction;
  68.  
  69. @property (nonatomic, copy) void(^dismissComplete)(void);//消失的回调
  70.  
  71. /**
  72. 配置选项,注意:设置上面属性之后调用
  73.  
  74. @param items 含文字和标题的对象数组
  75. @param action 点击回调,根据index判断点击的第几个
  76. */
  77. - (void)configWithItems:(NSArray<LFPopupMenuItem *>*)items action:(void(^)(NSInteger index))action;
  78.  
  79. /**完全自定义菜单弹窗*/
  80. - (void)configWithCustomView:(UIView *)customView;
  81.  
  82. /**
  83. 显示菜单窗,有imgBG的情况下调用
  84. @param point 本控件“左上角”位置,相对window
  85. */
  86. - (void)showInPoint:(CGPoint)point;
  87.  
  88. /**
  89. 显示菜单窗,无imgBG的情况下调用
  90. @param point 箭头顶点位置,相对window
  91. */
  92. - (void)showArrowInPoint:(CGPoint)point;
  93.  
  94. /**
  95. 显示菜单窗,无imgBG的情况下调用(推荐)
  96.  
  97. @param view 箭头对准的view
  98. */
  99. - (void)showArrowToView:(UIView*)view;
  100.  
  101. - (void)dismiss;
  102.  
  103. @end

这只是LFKit的一个子库,LFKit地址https://github.com/zhanglinfeng/LFKit

只需LFPopupMenu的 pod 'LFKit/Component/LFPopupMenu'

需要LFKit中所有自定义控件的pod 'LFKit/Component'

需要总库的 pod 'LFKit'

iOS 带箭头菜单选项弹窗LFPopupMenu的更多相关文章

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

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

  2. 不得不吐槽的Android PopupWindow的几个痛点(实现带箭头的上下文菜单遇到的坑)

    说到PopupWindow,我个人感觉是又爱又恨,没有深入使用之前总觉得这个东西应该很简单,很好用,但是真正使用PopupWindow实现一些效果的时候总会遇到一些问题,但是即便是人家的api有问题, ...

  3. iOS重写drawRect方法实现带箭头的View

    创建一个UIView的子类,重写drawRect方法可以实现不规则形状的View,这里提供一个带箭头View的实现代码: ArrowView.h #import <UIKit/UIKit.h&g ...

  4. 如何在webapp中做出原生的ios下拉菜单效果

    github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...

  5. popover带箭头弹框

    我们先来看一下效果吧: 分析:这个带箭头的弹框其实是一个控制器,通过Modal方式展现,但跟传统模态方式效果不一样,我们一眼就能看出. Xib方式实现popover: 1.segue的时候选择Pres ...

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

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

  7. EXT.NET 使用总结(2) ---TreePanel(带右键菜单,节点自定义属性)

    TreePanel(带右键菜单,节点自定义属性) 其实这个树控件也挺好用的.http://www.ztree.me/v3/main.php#_zTreeInfo html <ext:Panel ...

  8. 用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示。

    用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示. 原因:在为一个元素绑定hover事件之后,用户把光标移入元素 ...

  9. css实现带箭头选项卡

    这阵子在做一个web端项目中遇到一个问题,需要实现带箭头的选项卡点击可切换.起初没想太多,直接切一个向上的小箭头图片,外层div设置相同颜色的边框,再用相对定位和绝对定位.这种方法是可行的,但是因为手 ...

随机推荐

  1. vue路由-动态路由和嵌套路由

    一.动态路由 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那么,我们可以在 vue-route ...

  2. TCP的3次握手/4次握手

    三次握手: 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图下所示: (1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SE ...

  3. C++中STL容器的比较

    基本参考 https://blog.csdn.net/qq_14898543/article/details/51381642 容器特性: vector:典型的序列容器,C++标准严格要求次容器的实现 ...

  4. 一个gulp用于开发与生产的示例

    gulp是一款流行的前端构建工具,可以帮我们完成许多工作:监听文件修改.刷新浏览器.编译Less/Scss.压缩代码.添加md5.合并文件等.gulp的配置和使用特别简单,学习gulp过程中顺便写了一 ...

  5. MySQL数据库分表分区(一)(转)

    面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗? 答案是肯定的,一个表的总记录超过1000W,在操作系统层面检索也是效率非常低的   解决方案: 目前针对 ...

  6. php文件上传错误信息

    错误信息说明 UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功 UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini和upload_max_filesize ...

  7. Highcharts创建一个简单的柱状图

    新建一个html文件,将highcharts引入到你的页面后,通过两个步骤我们就可以创建一个简单的图表了. 1.创建div容器 在页面的 body部分创建一个div,并指定div 的 id,高度和宽度 ...

  8. QQ分享 QQ空间分享 API链接:

    QZone: "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITL ...

  9. 如何在SQL Server中的SELECT TOP 中使用变量

    语法   [ TOP (expression) [PERCENT] [ WITH TIES ] ] 注意:expression 是在一对圆括号内的,而之后又有如下的例子 在 TOP 中使用变量 以下示 ...

  10. 201. Non Absorbing DFA

    题意好难看懂的说... 有限状态自动机DFA是这么一个有序组<Σ, U, s, T, phi>:Σ代表输入字符集,表示此自动机的工作范围:U代表所有的状态集合:s是初始状态:T是最终状态: ...