#import <UIKit/UIKit.h>
@class ZMDropDownView;
NS_ASSUME_NONNULL_BEGIN
@protocol ZMDropDownViewDelegate <NSObject>
@optional
-(void)dropDownMenu:(ZMDropDownView *)dropV item:(NSString *)items;
@end
@interface ZMDropDownView : UIView
@property(weak,nonatomic)id<ZMDropDownViewDelegate>delegate;
-(instancetype)initwithDataItems:(NSArray<NSString *>*)dataItems rowHeight:(CGFloat)height;
-(void)unFoldOrFold;
@end
@interface DropDownTableViewCell : UITableViewCell
@property(strong,nonatomic)NSString *title;
@end
NS_ASSUME_NONNULL_END
#import "ZMDropDownView.h"
@interface ZMDropDownView ()<UITableViewDelegate,UITableViewDataSource>
@property(strong,nonatomic)NSArray<NSString *> *menuArr;
@property(strong,nonatomic)UITableView *tb;
@property(assign,nonatomic)CGFloat rowHeight;
@end
@implementation ZMDropDownView
-(UITableView *)tb
{
if (!_tb) {
_tb = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 0) style:UITableViewStylePlain];
_tb.rowHeight = UITableViewAutomaticDimension;
_tb.dataSource = self;
_tb.delegate = self;
_tb.layer.cornerRadius = 5;
_tb.clipsToBounds = YES;
_tb.layer.borderColor = [UIColor grayColor].CGColor;
_tb.layer.borderWidth = 1.f;
}
return _tb;
}
-(instancetype)initwithDataItems:(NSArray<NSString *>*)dataItems rowHeight:(CGFloat)height;
{
if (self == [super init]) {
self.menuArr = dataItems;
self.rowHeight = height;
}
return self;
}
-(void)unFoldOrFold;
{
if ([self.subviews containsObject:self.tb]) {
[self fold];
}else
{
[self unFold];
}
}
-(void)fold;{
CGRect rect = self.tb.frame;
[UIView animateWithDuration:0.4 animations:^{
self.tb.frame = CGRectMake(0, 0, rect.size.width, 0);
} completion:^(BOOL finished) {
[self.tb removeFromSuperview];
}];
}
-(void)unFold;{
[self addSubview:self.tb];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
self.tb.frame = self.bounds;
[UIView commitAnimations];
}
#pragma mark UITableViewDataSource
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.menuArr.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"DropDownTableViewCell";
DropDownTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[DropDownTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
cell.title = self.menuArr[indexPath.row];
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return self.rowHeight;
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.delegate respondsToSelector:@selector(dropDownMenu:item:)]) {
[self.delegate dropDownMenu:self item:self.menuArr[indexPath.row]];
[self fold];
}
}
@end
@interface DropDownTableViewCell ()
@property(strong,nonatomic)UILabel *titleLabel;
@end
@implementation DropDownTableViewCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self laySUbData];
}
return self;
}
-(void)laySUbData{
UILabel *label = [[UILabel alloc] init];
label.textColor = [UIColor blackColor];
//字体大小与对齐方式保持与按钮的titleLabel一致
label.font = [UIFont systemFontOfSize:14];
label.textAlignment = NSTextAlignmentLeft;
[self.contentView addSubview:label];
self.titleLabel = label;
}
-(void)layoutSubviews
{
[super layoutSubviews];
self.titleLabel.frame = CGRectMake(5, 0, self.contentView.frame.size.width, self.contentView.frame.size.height);
}
-(void)setTitle:(NSString *)title{
_title = title;
}
@end
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger,ContentTitleType){
ContentTitleTypeLeft,
ContentTitleTypeRight,
ContentTitleTypeTop,
ContentTitleTypeBottom
};
NS_ASSUME_NONNULL_BEGIN
@interface DropButton : UIButton
-(instancetype)initWithType:(ContentTitleType)type tempStr:(NSString *)tempStr image:(UIImage *)normalImage highlightImage:(UIImage *)hightLightImage scale:(CGFloat)scale;
@end
#import "DropButton.h"
@interface DropButton()
@property(assign,nonatomic)ContentTitleType titltType;
@property(assign,nonatomic)CGFloat scale;
@end
@implementation DropButton
-(instancetype)initWithType:(ContentTitleType)type tempStr:(NSString *)tempStr image:(UIImage *)normalImage highlightImage:(UIImage *)hightLightImage scale:(CGFloat)scale;
{
if (self = [super init]) {
self.titltType = type;
self.scale = scale;
self.layer.cornerRadius = 2.0;
self.layer.masksToBounds = YES;
[self setTitle:tempStr forState:UIControlStateNormal];
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self setImage:normalImage forState:UIControlStateNormal];
[self setImage:hightLightImage forState:UIControlStateHighlighted];
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.font =[UIFont systemFontOfSize:14];
self.imageView.contentMode = UIViewContentModeCenter;
}
return self;
}
-(CGRect)titleRectForContentRect:(CGRect)contentRect;
{
switch (self.titltType) {
case ContentTitleTypeLeft:
return CGRectMake(0, 0, CGRectGetWidth(self.bounds)*self.scale,CGRectGetHeight(self.bounds));
break;
case ContentTitleTypeRight:
return CGRectMake(CGRectGetWidth(self.bounds)*(1-self.scale), 0, CGRectGetWidth(self.bounds)*self.scale,CGRectGetHeight(self.bounds));
break;
case ContentTitleTypeBottom:
return CGRectMake(0, CGRectGetHeight(self.bounds)*(1-self.scale), CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds)*self.scale);
break;
case ContentTitleTypeTop:
return CGRectMake(0, 0, CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds)*self.scale);
break;
default:
return [super titleRectForContentRect:contentRect];
break;
}
}
-(CGRect)imageRectForContentRect:(CGRect)contentRect;{
if (self.titltType == ContentTitleTypeTop) {
return CGRectMake(0, CGRectGetHeight(self.bounds)*self.scale, CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds)*(1-self.scale));
}else if (self.titltType == ContentTitleTypeLeft){
return CGRectMake(CGRectGetWidth(self.bounds)*self.scale, 0, CGRectGetWidth(self.bounds)*(1-self.scale),CGRectGetHeight(self.bounds));
}else if (self.titltType == ContentTitleTypeRight){
return CGRectMake(0,0, CGRectGetWidth(self.bounds)*(1-self.scale),CGRectGetHeight(self.bounds));
}else if (self.titltType == ContentTitleTypeBottom){
return CGRectMake(0, 0, CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds)*(1-self.scale));
}else
return [super imageRectForContentRect:contentRect];
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.targetBtn = [[DropButton alloc] initWithType:ContentTitleTypeLeft tempStr:@"items" image:[UIImage imageNamed:@"uc_area_code_pull"] highlightImage:[UIImage imageNamed:@"uc_area_code_pull"] scale:0.5];
self.targetBtn.frame = CGRectMake(0, 0, 80, 40);
self.targetBtn.center = self.view.center;
self.targetBtn.backgroundColor = [UIColor redColor];
[self.targetBtn addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.targetBtn];
self.menu = [[ZMDropDownView alloc] initwithDataItems:@[@"item1",@"item2",@"item3",@"item4"] rowHeight:30.f];
self.menu.delegate = self;
self.menu.frame = CGRectMake(100, 100, 80, 90);
self.menu.center = CGPointMake(self.view.center.x, self.view.center.y +70);
[self.view addSubview:self.menu];
}
- (IBAction)buttonClick:(UIButton *)sender {
[self.menu unFoldOrFold];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.menu unFoldOrFold];
}
#pragma mark:
-(void)dropDownMenu:(ZMDropDownView *)dropV item:(NSString *)items;
{
NSLog(@"-------click---------:%@",items);
}
非原创 仅供自己参考