iOS 自定义下拉选项框 —— HERO博客
来源:互联网 发布:青云创投 知乎 编辑:程序博客网 时间:2024/06/08 03:55
之前两篇简述了UISearchbar的属性、方法,以及UISearchbar的简单使用。本篇在此基础上简单封装了一个下拉选项框。
先看一下效果图:
封装的HWOptionButton属性:
@property (nonatomic,strong)NSArray *array; //需要显示的选项数组
@property (nonatomic,copy,readonly)NSString *title; //选择的标题
@property (nonatomic,assign,readonly)NSInteger row; //选择的行数
@property (nonatomic,assign)BOOL showPlaceholder; //是否显示提示文字,默认为显示
@property (nonatomic,assign)BOOL showSearchBar; //是否显示搜索条,默认为不显示
下面贴上代码:
ViewController:
#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end/*** ---------------分割线--------------- ***/#import "ViewController.h"#import "HWOptionButton.h"@interface ViewController ()<HWOptionButtonDelegate>@property (nonatomic, weak) HWOptionButton *optionButton;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; [self creatControl];}- (void)creatControl{ HWOptionButton *optionBtn = [[HWOptionButton alloc] initWithFrame:CGRectMake(50, 100, 200, 44)]; optionBtn.array = @[@"mac", @"kobe", @"tracy", @"allen", @"ios", @"android", @"swift", @"object", @"activity"]; optionBtn.delegate = self; optionBtn.showSearchBar = YES;// optionBtn.showPlaceholder = NO; [self.view addSubview:optionBtn]; self.optionButton = optionBtn; UIButton *sureBtn = [[UIButton alloc] initWithFrame:CGRectMake(50, 450, 200, 44)]; [sureBtn setTitle:@"确认" forState:UIControlStateNormal]; sureBtn.backgroundColor = [UIColor orangeColor]; [sureBtn addTarget:self action:@selector(sureBtnOnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:sureBtn];}- (void)sureBtnOnClick{ if ([_optionButton.title isEqualToString:@"-请选择-"]) { NSLog(@"未选择"); return; } NSLog(@"选择了第%ld行,标题为%@", _optionButton.row, _optionButton.title);}#pragma mark - HWOptionButtonDelegate- (void)didSelectOptionInHWOptionButton:(HWOptionButton *)optionButton{ //do something...}@end
HWOptionButton:
#import <UIKit/UIKit.h>@class HWOptionButton;@protocol HWOptionButtonDelegate <NSObject>//确认选项后,如有其它特殊操作,用此代理事件- (void)didSelectOptionInHWOptionButton:(HWOptionButton *)optionButton;@end@interface HWOptionButton : UIView@property (nonatomic, strong) NSArray *array;@property (nonatomic, copy, readonly) NSString *title;@property (nonatomic, assign, readonly) NSInteger row;@property (nonatomic, assign) BOOL showPlaceholder; //default is YES.@property (nonatomic, assign) BOOL showSearchBar; //default is NO.@property (nonatomic, weak) id<HWOptionButtonDelegate> delegate;@end/*** ---------------分割线--------------- ***/#import "HWOptionButton.h"#define KMainW [UIScreen mainScreen].bounds.size.width#define KMainH [UIScreen mainScreen].bounds.size.height#define KMarginYWhenMoving 20.0f#define KRowHeight 44.0f#define KMaxShowLine 6#define KFont [UIFont systemFontOfSize:15.0f]#define KBackColor [UIColor whiteColor]@interface HWOptionButton ()<UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate>@property (nonatomic, strong) NSArray *searchArray;@property (nonatomic, strong) UIWindow *cover;@property (nonatomic, strong) UITableView *tableView;@property (nonatomic, strong) UISearchBar *searchBar;@property (nonatomic, weak) UIView *view;@property (nonatomic, weak) UIButton *button;@property (nonatomic, copy, readwrite) NSString *title;@property (nonatomic, assign, readwrite) NSInteger row;@end@implementation HWOptionButtonstatic NSString *KOptionButtonCell = @"KOptionButtonCell";- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { [self setup]; } return self;}- (instancetype)initWithCoder:(NSCoder *)coder{ if (self = [super initWithCoder:coder]) { [self setup]; } return self;}- (void)setup { self.title = @"-请选择-"; UIButton *button = [[UIButton alloc] initWithFrame:self.bounds]; [button setTitleColor:[UIColor colorWithRed:180/255.0 green:180/255.0 blue:180/255.0 alpha:1.0f] forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected]; [button setTitle:_title forState:UIControlStateNormal]; button.titleLabel.font = KFont; [button setBackgroundImage:[UIImage imageNamed:@"optionBtn_nor"] forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button]; self.button = button; //搜索框 _searchBar = [[UISearchBar alloc] init]; _searchBar.barTintColor = KBackColor; _searchBar.layer.borderWidth = 1.0f; _searchBar.layer.borderColor = [[UIColor blackColor] CGColor]; _searchBar.delegate = self; _searchBar.keyboardType = UIKeyboardTypeASCIICapable; //选项视图 _tableView = [[UITableView alloc] init]; _tableView.rowHeight = KRowHeight; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; _tableView.layer.borderWidth = 1.0f; _tableView.layer.borderColor = [[UIColor blackColor] CGColor]; _tableView.dataSource = self; _tableView.delegate = self; self.showPlaceholder = YES; self.showSearchBar = NO;}- (void)buttonAction:(UIButton *)button{ [self creatControl]; [self endEditing];}- (void)creatControl{ //遮盖window _cover = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; _cover.windowLevel = UIWindowLevelAlert; _cover.hidden = NO; //window视图 UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [_cover addSubview:view]; self.view = view; //遮盖视图 UIView *backview = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; backview.backgroundColor = [UIColor colorWithRed:(0)/255.0 green:(0)/255.0 blue:(0)/255.0 alpha:0.0f]; [backview addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Tap:)]]; [self.view addSubview:backview]; //坐标转换 CGRect frame = [self.superview convertRect:self.frame toView:self.view]; //显示选项按钮 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, self.frame.size.width, self.frame.size.height)]; button.titleLabel.font = KFont; [button setTitle:_button.titleLabel.text forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(btnOnClick) forControlEvents:UIControlEventTouchUpInside]; [button setBackgroundImage:[UIImage imageNamed:@"optionBtn_sel"] forState:UIControlStateNormal]; [self.view addSubview:button]; //搜索框 if (_showSearchBar) { _searchBar.frame = CGRectMake(frame.origin.x, CGRectGetMaxY(frame), frame.size.width, KRowHeight); [self.view addSubview:_searchBar]; } //设置tableviewFrame NSInteger rowCount = _showSearchBar ? KMaxShowLine - 1 : KMaxShowLine; CGFloat tabelViewY = _showSearchBar ? CGRectGetMaxY(_searchBar.frame) : CGRectGetMaxY(frame); if (_array.count <= rowCount) { _tableView.frame = CGRectMake(frame.origin.x, tabelViewY, frame.size.width, _array.count * KRowHeight); }else { _tableView.frame = CGRectMake(frame.origin.x, tabelViewY, frame.size.width, rowCount * KRowHeight); } [self.view addSubview:_tableView];}- (void)endEditing{ [[[self findViewController] view] endEditing:YES];}- (UIViewController *)findViewController{ id target = self; while (target) { target = ((UIResponder *)target).nextResponder; if ([target isKindOfClass:[UIViewController class]]) { break; } } return target;}- (void)setArray:(NSArray *)array{ _array = array; self.searchArray = [_array copy]; [self setInfo];}- (void)setShowPlaceholder:(BOOL)showPlaceholder{ _showPlaceholder = showPlaceholder; [self setInfo];}- (void)setInfo{ if (!_showPlaceholder && _array.count > 0) { [_button setSelected:YES]; _title = _array[0]; [_button setTitle:_title forState:UIControlStateNormal]; } [_tableView reloadData];}- (void)btnOnClick{ [self dismissOptionAlert];}- (void)Tap:(UITapGestureRecognizer *)recognizer{ [self dismissOptionAlert];}- (void)dismissOptionAlert{ [_searchBar resignFirstResponder]; if (self.view.frame.origin.y == 0) { [self removeCover]; }else { [self searchBarTextDidEndEditing:_searchBar]; }}- (void)removeCover{ [_searchBar resignFirstResponder]; _cover.hidden = YES; _cover = nil;}#pragma mark - UISearchBarDelegate- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ if (searchText.length > 0) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchText]; _searchArray = [[_array filteredArrayUsingPredicate:predicate] copy]; }else { _searchArray = [_array copy]; } [_tableView reloadData];}- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{ UIView *view = self.superview; while (view.superview) { view = view.superview; } CGFloat Y = KMarginYWhenMoving - [self.superview convertRect:self.frame toView:self.view].origin.y; [UIView animateWithDuration:0.22f animations:^{ view.frame = CGRectMake(0, Y, KMainW, KMainH); self.view.frame = CGRectMake(0, Y, KMainW, KMainH); }]; return YES;}- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ UIView *view = self.superview; while (view.superview) { view = view.superview; } [UIView animateWithDuration:0.22f animations:^{ view.frame = CGRectMake(0, 0, KMainW, KMainH); self.view.frame = CGRectMake(0, 0, KMainW, KMainH); }completion:^(BOOL finished) { [self removeCover]; }];}#pragma mark - tableViewDelegate- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return _searchArray.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:KOptionButtonCell]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:KOptionButtonCell]; } cell.textLabel.text = _searchArray[indexPath.row]; cell.backgroundColor = [UIColor whiteColor]; cell.textLabel.font = KFont; return cell;}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ _row = indexPath.row; [_button setSelected:YES]; self.title = _searchArray[_row]; [self.button setTitle:self.title forState:UIControlStateNormal]; [self dismissOptionAlert]; if (_delegate && [_delegate respondsToSelector:@selector(didSelectOptionInHWOptionButton:)]) { [_delegate didSelectOptionInHWOptionButton:self]; }}@end
写博客是希望大家共同交流成长,博主水平有限难免有偏颇不足之处,欢迎批评指正。
4 0
- iOS 自定义下拉选项框 —— HERO博客
- iOS 自定义日历 —— HERO博客
- iOS 自定义键盘 —— HERO博客
- iOS 自定义UIButton点击动画特效 —— HERO博客
- iOS 自定义弹窗UIAlertView —— HERO博客
- iOS 自定义UIPickerView天数选择器视图 —— HERO博客
- iOS 自定义UIPickerView地区选择器视图 —— HERO博客
- iOS 自定义UIDatePicker日期选择器视图 —— HERO博客
- iOS 封装下拉、上拉刷新控件 —— HERO博客
- iOS UIScrollView简介 —— HERO博客
- iOS UICollectionView简介 —— HERO博客
- iOS UITextField简介 —— HERO博客
- iOS UIDynamic简介 —— HERO博客
- iOS 添加字体库 —— HERO博客
- iOS MD5加密 —— HERO博客
- iOS UITableView简介 —— HERO博客
- iOS 预产期计算器 —— HERO博客
- iOS UISearchBar简介 —— HERO博客
- 微信小程序css篇----所有属性(按字母排列:b开头)
- 横渠四句
- 工作细节总结
- bits/c++config.h找不到
- Unity3D 大型游戏 商业游戏(Diablo War)源码 部分重点(1)
- iOS 自定义下拉选项框 —— HERO博客
- EasyUI页面刷新后滚动条没有恢复到初始位置,已解决
- swift和objc混编
- 支付流程
- [BZOJ2333][SCOI2011]棘手的操作(可并堆||线段树+离线)
- node学习1
- printf打印参数的顺序问题
- Linux操作系统安装MetaQ
- zlog 交叉编译