为了供大家的参考学习特意将每个知识点 分开列出
注意这里的封装
我们对下拉菜单的 大小 内容大小 位置 都进行了改进
可以传入个UI控件 也可以传入一个控制器
当下拉菜单弹出的时候 要遮盖一层 将菜单意外界面 事件屏蔽
当点击空白处 下拉菜单收回
这里用到了转换坐标系 这个知识点在后面也会讲解到
#import <UIKit/UIKit.h>
@interface QHDropdownMenu : UIView
+(instancetype)menu;
@property(nonatomic,strong)UIView *content;
@property(nonatomic,strong)UIViewController *contentController;
/**
* 显示
*/
-(void)showFrom:(UIView *)from;
/**
* 销毁
*/
-(void)dismiss;
@end
#import "QHDropdownMenu.h"
@interface QHDropdownMenu()
/**
* 将来用来显示具体内容的容器
*/
@property(nonatomic,strong)UIImageView *containerView;
@end
@implementation QHDropdownMenu
//懒加载一般用强指针
//除非先创建
-(UIImageView *)containerView
{
if (!_containerView) {
//添加一个灰色图片控件
UIImageView *containerView = [[UIImageView alloc]init];
containerView.image = [UIImage imageNamed:@"popover_background"];
// containerView.width = 217;
// containerView.height = 217;
containerView.userInteractionEnabled = YES;
[self addSubview:containerView];
self.containerView = containerView;
}
return _containerView;
}
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//清除颜色
self.backgroundColor = [UIColor clearColor];
// //添加一个灰色图片控件
// UIImageView *containerView = [[UIImageView alloc]init];
// containerView.image = [UIImage imageNamed:@"popover_background"];
// containerView.width = 217;
// containerView.height = 217;
// containerView.userInteractionEnabled = YES;
// [self addSubview:containerView];
// self.containerView = containerView;
}
return self;
}
+(instancetype)menu
{
return [[self alloc]init];
}
-(void)setContent:(UIView *)content
{
_content = content;
//调整内部位置
content.x = 10;
content.y = 15;
//设置内容的宽度
// content.width = self.containerView.width - 2*content.x;
//设置灰色的高度
self.containerView.height = CGRectGetMaxY(content.frame)+11;
//设置灰色的宽度
self.containerView.width = CGRectGetMaxX(content.frame)+10;
//添加内容到灰色图片中
[self.containerView addSubview:content];
}
-(void)setContentController:(UIViewController *)contentController
{
_contentController = contentController;
self.content = contentController.view;
}
/**
* 显示
*/
-(void)showFrom:(UIView *)from
{
//1.获得最上面的窗口
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
//2.添加自己到窗口
[window addSubview:self];
//3.设置尺寸 创建出来都是全屏的
self.frame = window.bounds;
//4.调整灰色图片的位置
self.containerView.x = (self.width - self.containerView.width)*0.5;
//默认情况下,frame是父控件左上角坐标为原点
//转换坐标新
CGRect newFrame = [from convertRect:from.bounds toView:window];
self.containerView.centerX = CGRectGetMidX(newFrame);
self.containerView.y = CGRectGetMaxY(newFrame);
}
/**
* 销毁
*/
-(void)dismiss
{
[self removeFromSuperview];
}
/**
* 监听整个遮盖的面积
*
* @param touches <#touches description#>
* @param event <#event description#>
*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self dismiss];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end