IOS开发之自定义系统弹出键盘上方的view

IOS开发之自定义系统弹出键盘上方的view

分类: IOS 2014-11-18 09:26 1304人阅读 评论(0) 收藏 举报

目录(?)[+]

这篇文章解决的一个开发中的实际问题就是:当弹出键盘时,自定义键盘上方的view。目前就我的经验来看,有两种解决方法。一个就是利用 UITextField或者UITextView的inputAccessoryView属性,另一种,就是监听键盘弹出的notification来自 己解决相关视图的位置问题。

第一种解决方法相对比较简单,第二种的方法中有一个难题就是当键盘的输入方式,也就是中英文切换时,键盘的高度是会发生变化的。需要动态来调整相关视图的位置。下面开始详细介绍解决方法。

设定inputAccessoryView属性



UITextField或者UITextView有一个inputAccessoryView的属性,其类型是UIView。使用中,可以自定义一个 view,并将这个view传递给inputAccessoryView的属性即可。这种实现方式相对简单,可以满足很多情况的需求了。下面给出一些示例 代码。

// 新建一个UITextField,位置及背景颜色随意写的。
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 10, 200, 20)];
textField.backgroundColor = [UIColor grayColor];
[self.view addSubview:textField];

// 自定义的view
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
customView.backgroundColor = [UIColor lightGrayColor];
textField.inputAccessoryView = customView;

// 往自定义view中添加各种UI控件(以UIButton为例)
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 5, 60, 20)];
btn.backgroundColor = [UIColor greenColor];
[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[customView addSubview:btn];

上面代码很简单,一看就明白了。这里的键盘时通过UITextField的becomeFirstResponder后弹出的。而我在开发中就碰到了一种 情况,就是需要通过点击一个按钮来弹出键盘,同时键盘上方的自定义视图中需要包含一个UITextView。这时,这种情况就不适用了。需要用到第二种方 法。

监听键盘事件动态改变自定义view位置

这种方法的思路就是首先自己写一个view,然后监听键盘的事件,得到键盘的位置后调整自己写的view的位置,保证这个view的下边界与键盘的上边界 相接。在自定义view中包含一个UITextField或者UITextView。通过代码调用其becomeFirstResponder方法来弹出 键盘。

下面写一些关键代码,其中自定义的view名为_mainView,全局变量。

监听键盘事件代码:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeContentViewPoint:) name:UIKeyboardWillShowNotification object:nil];

相关的函数代码:

// 根据键盘状态,调整_mainView的位置
- (void) changeContentViewPoint:(NSNotification *)notification{
    NSDictionary *userInfo = [notification userInfo];
    NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGFloat keyBoardEndY = value.CGRectValue.origin.y;  // 得到键盘弹出后的键盘视图所在y坐标

    NSNumber *duration = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curve = [userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];

    // 添加移动动画,使视图跟随键盘移动
    [UIView animateWithDuration:duration.doubleValue animations:^{
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationCurve:[curve intValue]];

        _mainView.center = CGPointMake(_mainView.center.x, keyBoardEndY - STATUS_BAR_HEIGHT - _mainView.bounds.size.height/2.0);   // keyBoardEndY的坐标包括了状态栏的高度,要减去

    }];

}

其中添加了一个动画,使得过渡效果好一点。 mainView中即可添加自定义的UI控件。注意,这个mainView中控件要从最下面开始布局,因为上述代码是以下方为准的。

时间: 2024-10-26 09:35:16

IOS开发之自定义系统弹出键盘上方的view的相关文章

两种自定义系统弹出键盘上方的view

我们在很多的应用中,都可能会遇到,在弹出的键盘上方的view,添加一些控件来作辅助功能,下面我通过2种情况来介绍: // 屏幕的物理高度 #define ScreenHeight [UIScreen mainScreen].bounds.size.height // 屏幕的物理宽度 #define ScreenWidth [UIScreen mainScreen].bounds.size.width @interface HMTMainViewController () @property (n

iOS开发- 自动消失的弹出框

- (void)timerFireMethod:(NSTimer*)theTimer//弹出框 { UIAlertView *promptAlert = (UIAlertView*)[theTimer userInfo]; [promptAlert dismissWithClickedButtonIndex:0 animated:NO]; promptAlert =NULL; } - (void)showAlert:(NSString *) _message{//时间 UIAlertView *

iOS开发日记15-强制弹出系统键盘(禁用搜狗键盘)

今天博主有一个强制弹出系统键盘的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 起因是在使用搜狗的过程中,使用中文字符标点产生了bug,应该是搜狗的问题.追询一番无果后,决定禁用搜狗键盘,使用系统自带的键盘. 尝试了很多方法,通知,KVO等等,最后找到了一个系统的API,十分的简便,分享给大家. 在AppDelegate中添加如下代码,即可. //强制使用系统键盘 - (BOOL)application:(UIApplication *)application shouldAllow

iOS开发——点击UITextField弹出UIDatePicker的协议实现方法

UITextField是用来接受用户输入的控件,它的优点是灵活性大,用户可以随便输入,但有时候这也是其缺点.对我们而言,典型的一个问题就是格式检查.然而我们也会遇到想让用户输入日期的时候,这个时候再进行格式检查就有些小题大做了,毕竟iOS已经为我们提供了一个UIDatePicker来进行日期选择,这样一个很自然的想法就是当用户点击UITextField的时候弹出的不是键盘,而是我们的UIDatePicker. 一个简单地方法是将自己的UIDatePicker直接赋给UITextField的inp

iOS开发 编辑框被系统弹出的软键盘遮挡问题

我们在开发注冊界面的时候,最后几个注冊条件经常easy被系统弹出的键盘遮挡,例如以下图: 能够看见,邮箱条件被遮挡掉了,怎么解决呢?我是通过UITextField的代理加计算偏移量: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.emailTextField.delegate = self; } - (

iOS开发,使用Category实现键盘弹出时,移动View以防被遮住

嗯,直接上代码!!!! 这是.h文件的 #import <UIKit/UIKit.h> @interface UIView (AboutKeyboard) @property (nonatomic) CGFloat moveDistince; @property (nonatomic) UIView *moveView; /* *指定一个View在键盘出现和消失时移动,如果存在superView则移动superView,否则移动自身 */ - (void)registerWhenKeyboar

iOS开发之自定义表情键盘(组件封装与自动布局)

下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情键盘的.下面的内容会比较多,这篇博文还是比较有料的. 还是那句话写技术博客是少不了代码的,下面会结合代码来回顾一下iOS的知识,本篇博文中用到的知识点在前面的博客中都能找到相应的内容,本篇算是一个小小的功能整合.先来张图看

IOS问题汇总:2014-12-2 xcode6中iphone5模拟器中运行textfield不弹出键盘+点击return收键盘

1.xcode6中iphone5模拟器中运行textfield不弹出键盘 Hardware->Keyboard->Toggle Software Keyboard手动激活键盘 2.点击return收键盘(1)按住Ctrl,选中TextField,拖拽至ViewController使二者连接.(2)在.h中@interface那行添加.(3)在.m中添加代码: -(BOOL) textFieldShouldReturn:(UITextField *)textField{if (textField

获取弹出键盘时间,,,与高度

弹出键盘操作 //1.定制通知 //在初始化时定制通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; //2.对应的方法. -(void)KeyboardWillShow:(NSNotification *)notification { NSDictionary