1.首先确定点击文字的是什么,UITextview?UITextfield?UIButton?
2.展开的是滚轮 这个不会错,采用UIpickerView
3.UITextview和UITextfield都有自带的inputview和inputAccessoryView属性
当你想在键盘上展示一个自定义的view时,你就可以设置该属性。你设置的view就会自动和键盘keyboard一起显示了。
需要注意的是,你所自定义的view既不应该处在其他的视图层里,也不应该成为其他视图的子视图。其实也就是说,你所自定义的view只需要赋给属性inputAccessoryView就可以了,不要再做其他多余的操作。如果你是xib或者故事版布局 不要把它们拖到viewcontroller里面
4.UIButton默认不带inputview和inputAccessoryView属性,一会自定义
5.先走一遍逻辑:点击文字呼出编辑所触发的自定义inputview和inputAccessoryView,这时候滚轮选择器就是这个inputview,那inputAccessoryView会是啥呢?
这时候你应该会想起那个取消和完成的控制操作栏吧?没错就可以放这个操作的UIToolbar
6.随后是代码
(1)自定义带inputview的UIbutton,如果你不需要这个uibutton,可以直接跳过看(2)
#import <UIKit/UIKit.h>
@interface LouisDropDownButton : UIButton
@property(strong,nonatomic,readwrite) UIView *inputView;
@property(strong,nonatomic,readwrite) UIView *inputAccessoryView;
- (void)setTitleByMy:(NSString *)title forState:(UIControlState)state;
@end
#import "LouisDropDownButton.h"
@implementation LouisDropDownButton
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@synthesize inputView, inputAccessoryView;
//有些人说需要把canBecomeFirstResponder方法重写成下面这样,但是我使用过了,不会启动inputview,没效果
//必须在使用该自定义button的地方也要加一句[mCustomBtn becomeFirstResponder];
- (BOOL) canBecomeFirstResponder {
return YES;
}
//- (void)dealloc {
// [inputView release];
// [inputAccessoryView release];
// [super dealloc];
//}
- (void)setupViewTitle
{
NSString *title = [self titleForState:UIControlStateNormal];
[self setTitleByMy:title forState:UIControlStateNormal]; //Adds arrow if title set in storyboard
//UIImage *btnIconImage = [UIImage imageNamed:@"dropDown.png"];
// [self setImage:btnIconImage forState:UIControlStateNormal];
//imageEdgeInsets(top,left,bottom,right) 和 titleEdgeInsets(top,left,bottom,right)的值就是我们想要的最终结果与按钮初始状态比较图片和标题的位置分别在上下左右位移的值
// CGFloat imageViewWidth=CGRectGetWidth(self.imageView.frame);//44
//CGFloat labelWidth= self.titleLabel.bounds.size.width;
// CGFloat labelWidth=CGRectGetWidth(self.titleLabel.frame);//2
// self.titleEdgeInsets = UIEdgeInsetsMake(0.0, 0.0-imageViewWidth, 0.0,0.0+labelWidth);
//self.imageEdgeInsets = UIEdgeInsetsMake(0.0, 0.0+labelWidth, 0.0, 0.0-labelWidth);
//self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
// self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;//设置button的内容横向居中。。设置content是title和image一起变化
}
- (void)awakeFromNib
{
[self setupViewTitle];
}
- (instancetype)init
{
if (self = [super init]) {
[self setupViewTitle];
}
return self;
}
- (void)setTitleByMy:(NSString *)title forState:(UIControlState)state
{
title = [title stringByAppendingString:@" \u25BE"]; //Unicode - Down arrow
[super setTitle:title forState:state];
[self sizeToFit];
}
@end
(2)主要代码:
初始化调用initInputView
(void)initInputView{
//拖出 一个UIToolbar和一个UIPickView,但不要附加到View中(拖到视图外面)。适当的连接Outlets。
//覆盖编辑框原有的inputView和inputAccessoryView
// _wherePickTextView.text=[pickDataArray objectAtIndex:0];
// _wherePickTextView.inputView=_wherePickView;
// //[self.wherePickView becomeFirstResponder];
// // _wherePickTextField.delegate = self;
// _wherePickTextView.inputAccessoryView=_wherePickViewToolbar;
NSString *strTitle=[pickDataArray objectAtIndex:0];
//调用覆写的setTitleByMy 里面附加了操作
[_wherePickButton setTitleByMy:strTitle forState:UIControlStateNormal];
// [_wherePickButton setTitle:strTitle forState:UIControlStateNormal];
_wherePickButton.inputView=_wherePickView;
_wherePickButton.inputAccessoryView=_wherePickViewToolbar;
}
点击文字的事件
- (IBAction)dropDownClick:(id)sender {
//点击设置第一响应者 就可以弹出button的inputView
[_wherePickButton becomeFirstResponder];
}
实现滚轮必要的一些父方法
//设置PickerView的列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
//返回行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [pickDataArray count];
}
//设置每行每列中的数据:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
// return pickDataArray[row];
return [pickDataArray objectAtIndex:row];
}
//即时选择完成之后的事件:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
// [_wherePickTextField setText:[NSString stringWithFormat:@"%@",pickDataArray[row]]];
[self changeTextFieldState:row];
}
-(void)changeTextFieldState:(long)index{
switch (index) {
case 0:
//phone 可用
_emailTextField.hidden=YES;
_phoneTextField.hidden=NO;
break;
case 1:
//email 可用
_emailTextField.hidden=NO;
_phoneTextField.hidden=YES;
break;
default:
break;
}
}
操作框的取消和完成事件
- (IBAction)cancelBtnClick:(id)sender {
//self.wherePickView.hidden=YES;
//self.wherePickViewToolbar.hidden=YES;
//####也可以[self.wherePickTextField resignFirstResponder];
//[self.wherePickTextField endEditing:YES];
[self.wherePickButton endEditing:YES];
[self changeTextFieldState:selectIndex];//用户没有选 恢复原来的textfield
}
- (IBAction)doneBtnClick:(id)sender {
//self.wherePickView.hidden=YES;
// self.wherePickViewToolbar.hidden=YES;
//####也可以[self.wherePickTextField resignFirstResponder];
//[self.wherePickTextField endEditing:YES];
[self.wherePickButton endEditing:YES];
NSInteger index=[self.wherePickView selectedRowInComponent:0];
selectIndex=index;
//[_wherePickTextField setText:[NSString stringWithFormat:@"%@",pickDataArray[index]]];
//[_wherePickButton.titleLabel setText:[NSString stringWithFormat:@"%@",pickDataArray[index]]];
//调用覆写的setTitleByMy 里面附加了操作
[_wherePickButton setTitleByMy:[NSString stringWithFormat:@"%@",pickDataArray[index]] forState:UIControlStateNormal];
}
PS:
我自己都是用故事版布局 拖动outlet和uiaction,自定义的地方都手动改成自定义的view