// 屏幕的物理高度 #define ScreenHeight [UIScreen mainScreen].bounds.size.height // 屏幕的物理宽度 #define ScreenWidth [UIScreen mainScreen].bounds.size.width @interface HMTMainViewController () @property (nonatomic, strong) UIView *testView; @property (nonatomic, strong) UITextField *testTextField; @property (nonatomic, strong) NSNumber *duration; @property (nonatomic, strong) NSNumber *curve; @end @implementation HMTMainViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.navigationItem.title = @"Demo"; [self testCustonKeyBoardView___1]; [self testCustonKeyBoardView___2]; } // 自定义系统弹出键盘上方的view ---> 普遍情况 - (void)testCustonKeyBoardView___1 { UITextField *testTextField = [[UITextField alloc] initWithFrame:CGRectMake(60, 200, 200, 40)]; testTextField.borderStyle = UITextBorderStyleRoundedRect; [self.view addSubview:testTextField]; // 自定义的view UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; customView.backgroundColor = [UIColor redColor]; testTextField.inputAccessoryView = customView; // 往自定义view中添加各种UI控件(以UIButton为例) UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(270, 5, 40, 30)]; button.backgroundColor = [UIColor blackColor]; [button setTitle:@"完成" forState:UIControlStateNormal]; [button addTarget:self action:@selector(didClickButtonAction) forControlEvents:UIControlEventTouchUpInside]; [customView addSubview:button]; } - (void)didClickButtonAction { NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,@"test"); [self.view endEditing:YES]; } // 自定义系统弹出键盘上方的view ---> 微信,QQ聊天等效果 - (void)testCustonKeyBoardView___2 { self.testView = [[UIView alloc] initWithFrame:CGRectMake(0, ScreenHeight - 40, 320, 40)]; _testView.backgroundColor = [UIColor grayColor]; [self.view addSubview:_testView]; self.testTextField = [[UITextField alloc] initWithFrame:CGRectMake(40, 2, 200, 36)]; _testTextField.borderStyle = UITextBorderStyleRoundedRect; [_testView addSubview:_testTextField]; UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeSystem]; leftBtn.frame = CGRectMake(242, 2, 36, 36); [leftBtn setTitle:@"-" forState:UIControlStateNormal]; leftBtn.titleLabel.font = [UIFont systemFontOfSize: 28.0]; [_testView addSubview:leftBtn]; UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeSystem]; rightBtn.frame = CGRectMake(282, 2, 36, 36); rightBtn.titleLabel.font = [UIFont systemFontOfSize: 28.0]; [rightBtn setTitle:@"+" forState:UIControlStateNormal]; [_testView addSubview:rightBtn]; // 通知-监听键盘弹出事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeKeyboardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil]; // 通知-监听键盘回收事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeKeyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil]; } - (void)changeKeyboardWillShowNotification:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; // 键盘弹出后的frame的结构体对象 NSValue *valueEndFrame = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; // 得到键盘弹出后的键盘视图所在y坐标 CGFloat keyBoardEndY = valueEndFrame.CGRectValue.origin.y; // 键盘弹出的动画时间 self.duration = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; // 键盘弹出的动画曲线 self.curve = [userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey]; // 添加移动动画,使视图跟随键盘移动(动画时间和曲线都保持一致) [UIView animateWithDuration:[_duration doubleValue] animations:^{ [UIView setAnimationBeginsFromCurrentState:YES]; // 不设置这个,大家可以看看有什么区别 [UIView setAnimationCurve:[_curve intValue]]; _testView.center = CGPointMake(_testView.center.x, keyBoardEndY - _testView.bounds.size.height/2.0); }]; /** * + (void)setAnimationCurve:(UIViewAnimationCurve)curve; * typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { * UIViewAnimationCurveEaseInOut, // 淡入淡出,开始时慢,由慢变快,中间最快,然后变慢 * UIViewAnimationCurveEaseIn, // 淡入,开始时慢然后越来越快 * UIViewAnimationCurveEaseOut, // 淡出,开始快然后越来越慢 * UIViewAnimationCurveLinear // 线性匀速,开始和结束是一个速度 * }; */ } - (void)changeKeyboardWillHideNotification:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; // 键盘弹出前的frame的结构体对象 NSValue *valueStatrFrame = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; // 得到键盘弹出后的键盘视图所在y坐标 CGFloat keyBoardStatrY = valueStatrFrame.CGRectValue.origin.y; [UIView animateWithDuration:[_duration doubleValue] animations:^{ [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationCurve:[_curve intValue]]; _testView.center = CGPointMake(_testView.center.x, keyBoardStatrY - _testView.bounds.size.height/2.0); }]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; }
@示例图:
两种自定义系统弹出键盘上方的view,布布扣,bubuko.com
原文地址:http://blog.csdn.net/hmt20130412/article/details/38685861