iOS开发项目篇—15菜单栏扩展
iOS开发项目篇—16菜单栏扩展
一、简单说明
在15中菜单栏的内在实现效果:
15中是通过Button来监听外部的点击,并做出响应。如果只是单纯的监听点击事件,去掉button,直接用View,给View添加一个手势识别器以监听。
二、在按钮的背后添加一个蒙版
自定义类中增加一个BOOL型的属性
1 // 2 // YYPopMenu.h 3 4 #import <UIKit/UIKit.h> 5 @class YYPopMenu; 6 7 @protocol YYPopMenuDelegate <NSObject> 8 9 @optional 10 -(void)popMenuDidDismissed:(YYPopMenu *)popMenu; 11 @end 12 13 14 @interface YYPopMenu : UIView 15 /** 16 * 初始化方法 17 */ 18 -(instancetype)initWithContentView:(UIView *)contentView; 19 +(instancetype)popMenuWithContentView:(UIView *)contentView; 20 21 /** 22 * 设置菜单的背景图片 23 */ 24 -(void)setBackground:(UIImage *)background; 25 /** 26 * 显示菜单 27 */ 28 -(void)showInRect:(CGRect)rect; 29 30 /** 31 * 关闭菜单 32 */ 33 -(void)dismiss; 34 35 @property(nonatomic,strong)id<YYPopMenuDelegate> delegate; 36 @property(nonatomic,assign,getter = isdimBackground)BOOL dimBackground; 37 @end
在类的实现中重写set方法,设置蒙版
1 #pragma mark-公共方法 2 -(void)setDimBackground:(BOOL)dimBackground 3 { 4 _dimBackground=dimBackground; 5 if (self.isdimBackground) { 6 self.cover.backgroundColor=[UIColor blackColor]; 7 self.cover.alpha=0.3; 8 }else 9 { 10 self.cover.backgroundColor=[UIColor clearColor]; 11 self.cover.alpha=1.0; 12 } 13 }
点击的时候在背后增加一层蒙版
1 [titleButton setImage:[UIImage imageWithName:@"navigationbar_arrow_up"] forState:UIControlStateNormal]; 2 3 UITableView *tableView=[[UITableView alloc]init]; 4 [tableView setBackgroundColor:[UIColor yellowColor]]; 5 YYPopMenu *menu=[YYPopMenu popMenuWithContentView:tableView]; 6 [menu showInRect:CGRectMake(60, 55, 200, 200)]; 7 menu.dimBackground=YES; 8 menu.delegate=self;
实现效果:
三、设置弹出菜单的箭头的位置为左、中、右
自定义类的头文件
1 // 2 // YYPopMenu.h 3 // 08-微博弹出菜单 4 // 5 6 #import <UIKit/UIKit.h> 7 @class YYPopMenu; 8 typedef enum { 9 YYPopMenuArrowPositionCenter=0, 10 YYPopMenuArrowPositionLeft=1, 11 YYPopMenuArrowPositionRight=2, 12 13 }YYPopMenuArrowPosition; 14 15 @protocol YYPopMenuDelegate <NSObject> 16 17 @optional 18 -(void)popMenuDidDismissed:(YYPopMenu *)popMenu; 19 @end 20 21 22 @interface YYPopMenu : UIView 23 /** 24 * 初始化方法 25 */ 26 -(instancetype)initWithContentView:(UIView *)contentView; 27 +(instancetype)popMenuWithContentView:(UIView *)contentView; 28 29 /** 30 * 设置菜单的背景图片 31 */ 32 -(void)setBackground:(UIImage *)background; 33 /** 34 * 显示菜单 35 */ 36 -(void)showInRect:(CGRect)rect; 37 38 /** 39 * 关闭菜单 40 */ 41 -(void)dismiss; 42 43 @property(nonatomic,strong)id<YYPopMenuDelegate> delegate; 44 @property(nonatomic,assign,getter = isdimBackground)BOOL dimBackground; 45 @property(nonatomic,assign) YYPopMenuArrowPosition arrowPosition; 46 @end
在类的实现中,重写arrowPosition的set方法
1 // 2 // YYPopMenu.m 3 // 08-微博弹出菜单 4 // 5 6 #import "YYPopMenu.h" 7 8 @interface YYPopMenu() 9 @property(nonatomic,strong)UIView *contentView; 10 /** 11 * 最底部的遮盖 :屏蔽除菜单以外控件的事件 12 */ 13 @property(nonatomic,strong)UIImageView *container; 14 /** 15 * 最底部的遮盖 :屏蔽除菜单以外控件的事件 16 */ 17 @property(nonatomic,strong)UIButton *cover; 18 @end 19 @implementation YYPopMenu 20 21 #pragma mark-初始化方法 22 //init方法会调用该方法 23 - (id)initWithFrame:(CGRect)frame 24 { 25 self = [super initWithFrame:frame]; 26 if (self) { 27 /**添加菜单内部的两个子控件*/ 28 //1.添加一个遮盖按钮 29 UIButton *cover=[[UIButton alloc]init]; 30 //清除颜色 31 cover.backgroundColor=[UIColor clearColor]; 32 [cover addTarget:self action:@selector(coverClick) forControlEvents:UIControlEventTouchUpInside]; 33 [self addSubview:cover]; 34 self.cover=cover; 35 36 //2.添加单箭头的菜单图片 37 UIImageView *container=[[UIImageView alloc]init]; 38 //设置为可交互的 39 container.userInteractionEnabled=YES; 40 container.size=CGSizeMake(200, 100); 41 container.image=[UIImage resizedImage:@"popover_background"]; 42 [self addSubview:container]; 43 self.container=container; 44 } 45 return self; 46 } 47 48 -(instancetype)initWithContentView:(UIView *)contentView 49 { 50 if (self=[super init]) { 51 self.contentView=contentView; 52 } 53 return self; 54 } 55 56 +(instancetype)popMenuWithContentView:(UIView *)contentView 57 { 58 return [[self alloc]initWithContentView:contentView]; 59 } 60 61 -(void)layoutSubviews 62 { 63 [super layoutSubviews]; 64 self.cover.frame=self.bounds; 65 } 66 #pragma mark-内部方法 67 -(void)coverClick 68 { 69 [self dismiss]; 70 } 71 72 #pragma mark-公共方法 73 -(void)setDimBackground:(BOOL)dimBackground 74 { 75 _dimBackground=dimBackground; 76 if (self.isdimBackground) { 77 self.cover.backgroundColor=[UIColor blackColor]; 78 self.cover.alpha=0.3; 79 }else 80 { 81 self.cover.backgroundColor=[UIColor clearColor]; 82 self.cover.alpha=1.0; 83 } 84 } 85 86 -(void)setArrowPosition:(YYPopMenuArrowPosition)arrowPosition 87 { 88 _arrowPosition=arrowPosition; 89 switch (_arrowPosition) { 90 case YYPopMenuArrowPositionCenter: 91 self.container.image=[UIImage resizedImage:@"popover_background"]; 92 break; 93 94 case YYPopMenuArrowPositionLeft: 95 self.container.image=[UIImage resizedImage:@"popover_background_left"]; 96 break; 97 98 case YYPopMenuArrowPositionRight: 99 self.container.image=[UIImage resizedImage:@"popover_background_right"]; 100 break; 101 } 102 } 103 -(void)setBackground:(UIImage *)background 104 { 105 self.container.image=background; 106 } 107 108 -(void)showInRect:(CGRect)rect 109 { 110 //添加菜单到整体的窗口上 111 UIWindow *window=[UIApplication sharedApplication].keyWindow; 112 self.frame=window.bounds; 113 [window addSubview:self]; 114 115 //设置容器的frame 116 self.container.frame=rect; 117 [self.container addSubview:self.contentView]; 118 119 // 设置容器里面内容的frame 120 CGFloat topMargin = 12; 121 CGFloat leftMargin = 5; 122 CGFloat rightMargin = 5; 123 CGFloat bottomMargin = 8; 124 125 self.contentView.y = topMargin; 126 self.contentView.x = leftMargin; 127 self.contentView.width = self.container.width - leftMargin - rightMargin; 128 self.contentView.height = self.container.height - topMargin - bottomMargin; 129 130 } 131 132 -(void)dismiss 133 { 134 //一旦调用了该方法,就通知代理删除菜单栏 135 if ([self.delegate respondsToSelector:@selector(popMenuDidDismissed:)]) { 136 [self.delegate popMenuDidDismissed:self]; 137 } 138 [self removeFromSuperview]; 139 } 140 @end
调用代码:
1 -(void)titleButtonClick:(UIButton *)titleButton 2 { 3 // UIImage *titleImage=[UIImage imageWithName:@"navigationbar_arrow_down"]; 4 // 5 // if (titleButton.currentImage==titleImage) { 6 //换成箭头向上 7 [titleButton setImage:[UIImage imageWithName:@"navigationbar_arrow_up"] forState:UIControlStateNormal]; 8 9 UITableView *tableView=[[UITableView alloc]init]; 10 [tableView setBackgroundColor:[UIColor yellowColor]]; 11 YYPopMenu *menu=[YYPopMenu popMenuWithContentView:tableView]; 12 [menu showInRect:CGRectMake(60, 55, 200, 200)]; 13 menu.dimBackground=YES; 14 // menu.arrowPosition=YYPopMenuArrowPositionLeft; 15 menu.arrowPosition=YYPopMenuArrowPositionRight; 16 menu.delegate=self; 17 18 // }else 19 // { 20 // //换成箭头向下 21 // [titleButton setImage:[UIImage imageWithName:@"navigationbar_arrow_down"] forState:UIControlStateNormal]; 22 // } 23 }
实现效果:
箭头在左边和箭头在右边:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。