IOS 键盘的显示与关闭,以及移动显示(UITextView处理完整版)

IOS 键盘的显示与关闭

在每一个IOS应用中,几乎不可避免的要进行文本输入操作,例如要求用户填写登陆注册信息,进行话题的评论回复,等等。用到的文本输入组件有UITextField,UITextView,对于这两个组件的相关属性和方法想必大家都很熟悉,但貌似对于键盘的显示或隐藏过程貌似常常不是很清楚,其实本人也是一知半解,所以趁此做简单的总结,基本上以下描述出自于官方的文档,并没有什么更改。

1.开启键盘面板

当用户触击某一个view时,系统会自动指定该view为第一响应对象(first responser),(关于第一响应对象的我们估计可以把它看做一个标志位,每个贴上该标记的对象都能成为first responser,这样可能要好理解些)当某个包含了可编辑文本的view(UITextField或UITextView)成为第一响应对象后,该view会为文本输入开启一个"编辑会话"(editing session),之后该view会告知系统去开启并显示键盘,如果当前键盘处于隐藏状态,那么它会根据当前设备的旋转方向,自动调整并从application的底部以滑动动画形式出现,这通常都是我们看到并已熟知的键盘显示方式;如果当前键盘已处于显示状态,由于第一响应对象这个标记已被设置到当前的view上,所以键盘输入也被重定向到该view上了。

因为当一个view设置第一响应对象后,键盘会自动显示,通常情况下我们不用做其它任何事情。但是,有时我们可以调用可编辑文本view的becomeFirstResponder方法,来显示键盘。

如某一UITextField类的名为theTextField对象可调用以下方法:

?


1

[theTextField
becomeFirstResponder];

在可编辑view上调用该方法达到的效果,与用户触击该view的效果是一致的,首先会使该view成为第一响应对象,之后键盘被调用显示。

如果在应用中某一功能上需要同时管理几个文本输入,最后的做法是跟踪当前是哪一个view为第一响应对象,因为在之后的操作中我们可以选择性的关闭键盘。

2.关闭键盘

以上,我们可以看到,键盘的显示为IOS系统的自发行为,我们在程序上不用做任何处理,但关闭键盘的处理却于此相反:系统不会自动关闭键盘,在应用中我们自己要负责在合适的时间关闭键盘。其实这个洛是显而易见的,开启键盘的目的是为了输入文本,但关闭键盘的逻辑却因具体应用的处理逻辑的不同而不同。但通常情况下也只是在用户的某一行为下才会关闭键盘,例如用户触击了键盘的“Return”和“Done”按钮;或者是在填完并提交一个表单后要关闭键盘,所有的这些有IOS基本的用户界面行为设置,也有我们的应用功能决定的用户界面设置。

要关闭键盘,可以调用当前是第一响应对象的某一个包含可编辑文本view的resignFirstResponder方法。从字面意义上来看,resignFirstResponder与becomeFirstResponder方法的处理逻辑和作用是相反的,调用了resignFirstResponder的view会注销其第一响应对象的状态,并结束之前开启的“编辑会话”,并关闭键盘。也就是说,假如之前的theTextField对象当前为第一响应对象,要关闭键盘可以调用以下方法:

?


1

[theTextField
resignFirstResponder];

3.First Responser对象

对于first response对象,其实是在Application中那个第一个接受系统事件的对象,如键盘事件(key events),动作事件(motion events),以及action消息。在此不做介绍。

http://my.oschina.net/hmj/blog/99489

IOS 点击空白处隐藏键盘的几种方法

IOS7 点击空白处隐藏键盘的几种方法

IOS开发中经常要用到输入框,默认情况下点击输入框就会弹出键盘,但是必须要实现输入框return的委托方法才能取消键盘的显示,对于用户体验来说很不友好,我们可以实现点击键盘以外的空白区域来将键盘隐藏,以下我总结出了几种隐藏键盘的方法:

首先说明两种可以让键盘隐藏的Method:

1、[view endEditing:YES]  这个方法可以让整个view取消第一响应者,从而让所有控件的键盘隐藏。

2、[textFiled resignFirstResponder] 这个则是比较常用的让某个textFiled的键盘隐藏。

接下来就是几种实现方式:

第一种: 使用view的touchesBegan:触摸事件来实现对键盘的隐藏,当点击view的区域就会触发这个事件

[html] view
plain
copyprint?

  1. -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  2. [textFiled resignFirstResponder];
  3. }

第二种:创建自定义的触摸手势来实现对键盘的隐藏:

[html] view
plain
copyprint?

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(keyboardHide:)];
  5. //设置成NO表示当前控件响应后会传播到其他控件上,默认为YES。
  6. tapGestureRecognizer.cancelsTouchesInView = NO;
  7. //将触摸事件添加到当前view
  8. [self.view addGestureRecognizer:tapGestureRecognizer];
  9. }
  10. -(void)keyboardHide:(UITapGestureRecognizer*)tap{
  11. [textFiled resignFirstResponder];
  12. }

第三种:修改xib中UIView的Custom class为UIControl,UIControl是一些常用控件如UIButton的父类,是UIView的派生类,实现了对触摸和下按的封装。

1、首先设置xib中得UIView的Custom class为UIControl

2、设置关系事件,将xib中得UIView拖到.h区中

设置好事件为Touch Up Inside

3、编写隐藏代码:

[html] view
plain
copyprint?

  1. - (IBAction)touchView:(id)sender {
  2. [self.view endEditing:YES];
  3. }

好了,以上是三种比较常用的隐藏键盘的方法,每种都可以用于不同的场合和它的利与弊,就看如何运用了。

http://blog.csdn.net/swingpyzf/article/details/17091567

UITextView的用法及技巧(ios7下光标bug解决方案)

一、新建一个textView

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//初始化

UITextView
*textView = [[[UITextView alloc] init] autorelease];

//设置代理
需在interface中声明UITextViewDelegate

textView.delegate
= self;

//字体大小

textView.font
= [UIFont systemFontOfSize:16];

//添加滚动区域

textView.contentInset
= UIEdgeInsetsMake(-11, -6, 0, 0);

//是否可以滚动

textView.scrollEnabled
= NO;

//获得焦点

[textView
becomeFirstResponder];

?


1

[self.view
addSubview:textView];

二、键盘操作

?


1

2

3

4

5

//返回键的类型

textView.returnKeyType
= UIReturnKeyDefault;

//键盘类型

textView.keyboardType
= UIKeyboardTypeDefault;

三、隐藏键盘的几种方式

个人还是认为最方便的是在键盘上加上一个ToolBar,在上面加上一个按钮来隐藏键盘

①在键盘上加上隐藏按钮

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//定义一个toolBar

UIToolbar
* topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];

//设置style

[topView
setBarStyle:UIBarStyleBlack];

//定义两个flexibleSpace的button,放在toolBar上,这样完成按钮就会在最右边

UIBarButtonItem
* button1 =[[UIBarButtonItem  alloc]initWithBarButtonSystemItem:                                        UIBarButtonSystemItemFlexibleSpace target:self action:nil];

UIBarButtonItem
* button2 = [[UIBarButtonItem  alloc]initWithBarButtonSystemItem:                                        UIBarButtonSystemItemFlexibleSpace target:self action:nil];

//定义完成按钮

UIBarButtonItem
* doneButton = [[UIBarButtonItem alloc]initWithTitle:@
"完成"style:UIBarButtonItemStyleDone 
target:self action:@selector(resignKeyboard)];

    

//在toolBar上加上这些按钮

NSArray
* buttonsArray = [NSArray arrayWithObjects:button1,button2,doneButton,nil];    

[topView
setItems:buttonsArray];

[textView
setInputAccessoryView:topView];

?


1

2

3

4

//隐藏键盘

-
(
void)resignKeyboard
{

    [textView
resignFirstResponder];

}

最终效果

还有几种也可隐藏键盘的方式

②用回车键,前提是你的textView中不需要用到回车键

?


1

2

3

4

5

6

7

-(BOOL)textView:(UITextView
*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

 if([text
isEqualToString:@
"\n"])

{

[textView
resignFirstResponder];
returnNO;

}

 returnYES;

}

③触摸空白处隐藏键盘

?


1

2

3

4

5

-(void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event

{

    //隐藏键盘

    [textView
resignFirstResponder];

}

四、使键盘不挡住输入框

在view中添加一个子view,设置此子view的tag值为1000,在此view上添加一个textView和一个发送按钮,如下图;我们要达到textView的键盘弹出时,整个View往上平移,键盘消失,view往下平移的效果,模拟发送短信的界面。

设置textView圆角

?


1

2

//设置textView圆角

[self.textView.layer
setCornerRadius:10];

①、在viewWillAppear中添加键盘监听事件

?


1

2

3

4

5

6

7

//添加键盘的监听事件

    

    //注册通知,监听键盘弹出事件

    [[NSNotificationCenter
defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

    

    //注册通知,监听键盘消失事件

    [[NSNotificationCenter
defaultCenter] addObserver:self selector:@selector(keyboardDidHidden) name:UIKeyboardDidHideNotification object:nil];

②、完成①selector中键盘弹出keyboardDidShow:和消失keyboardDidHidden方法

在.m文件#import后面添加

?


1

2

3

4

//动画时间

#define
kAnimationDuration 0.2

//view高度

#define
kViewHeight 56

键盘出现

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//
键盘弹出时

-(void)keyboardDidShow:(NSNotification
*)notification

{

    

    //获取键盘高度

    NSValue
*keyboardObject = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];

    

    CGRect
keyboardRect;

    

    [keyboardObject
getValue:&keyboardRect];

    

    //调整放置有textView的view的位置

    

       //设置动画

    [UIView
beginAnimations:nil context:nil];

    

       //定义动画时间

    [UIView
setAnimationDuration:kAnimationDuration];

    

       //设置view的frame,往上平移

    [(UIView
*)[self.view viewWithTag:1000] setFrame:CGRectMake(0, self.view.frame.size.height-keyboardRect.size.height-kViewHeight, 320, kViewHeight)];

    

    [UIView
commitAnimations];

    

}

键盘消失

?


1

2

3

4

5

6

7

8

9

10

//键盘消失时

-(void)keyboardDidHidden

{

    //定义动画

    [UIView
beginAnimations:nil context:nil];

    [UIView
setAnimationDuration:kAnimationDuration];

    //设置view的frame,往下平移

    [(UIView
*)[self.view viewWithTag:1000] setFrame:CGRectMake(0, self.view.frame.size.height-kViewHeight, 320, kViewHeight)];

    [UIView
commitAnimations];

}

效果图:

iOS7光标问题

PS:有网友遇到textView在ios7上出现编辑进入最后一行时光标消失,看不到最后一行,变成盲打,stackOverFlow网站上有大神指出,是ios7本身bug,加上下面一段代码即可(网友调试得出,在此mark一下,有问题,欢迎大神们指出)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

-(void)textViewDidChange:(UITextView
*)textView {

    CGRect
line = [textView caretRectForPosition:

                   textView.selectedTextRange.start];

    CGFloat
overflow = line.origin.y + line.size.height

    -
( textView.contentOffset.y + textView.bounds.size.height

       -
textView.contentInset.bottom - textView.contentInset.top );

    if(
overflow > 0 ) {

        //
We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it)

        //
Scroll caret to visible area

        CGPoint
offset = textView.contentOffset;

        offset.y
+= overflow + 7;
//
leave 7 pixels margin

        //
Cannot animate with setContentOffset:animated: or caret will not appear

        [UIView
animateWithDuration:.2 animations:^{

            [textView
setContentOffset:offset];

        }];

    }

}

http://my.oschina.net/joanfen/blog/140143

总结:

说明可以直接拿来用,从下面网上看==============

// 增加textview 点击处理效果
-(void) touchesInTextView:(UITapGestureRecognizer*)tap
{
    if (!bisShowKeyboard)
    {
        // 向上移动
        [self keyboardShow:nil];

        // 显示键盘
        [self.textView becomeFirstResponder];
    }
    else
    {
        // 向下移动
        [self keyboardHide:nil];

        // 隐藏键盘
        [self.textView resignFirstResponder];
    }

}
</pre><pre code_snippet_id="677143" snippet_file_name="blog_20150527_3_3193943" name="code" class="objc">// 键盘弹出时
-(void)keyboardShow:(NSNotification *)notification
{
    bisShowKeyboard = YES;

    //设置动画
    [UIView beginAnimations:nil context:nil];

    //定义动画时间
    [UIView setAnimationDuration:kAnimationDuration];

    // 重新设置移动位置
    CGRect rect;
    rect = self.scrollView.frame;
    rect.origin.y -= 150;
    self.scrollView.frame = rect;

    [UIView commitAnimations];

}

//键盘消失时
-(void)keyboardHide:(NSNotification *)notification
{
    bisShowKeyboard = NO;

    //设置动画
    [UIView beginAnimations:nil context:nil];

    //定义动画时间
    [UIView setAnimationDuration:kAnimationDuration];

    CGRect rect;
    rect = self.scrollView.frame;
    rect.origin.y = 0;
    self.scrollView.frame = rect;

    [UIView commitAnimations];
}

// 优化textView使用
-(void) optimizeTextView
{
    // 设置代理 需在interface中声明UITextViewDelegate
    self.textView.delegate = self;

    // 字体大小
    self.textView.font = [UIFont systemFontOfSize:16];

    // 添加滚动区域
    self.textView.contentInset = UIEdgeInsetsMake(-11, -6, 0, 0);

    // 是否可以滚动
    self.textView.scrollEnabled = YES;

//    // 获得焦点(键盘显示)
//    [self.textView becomeFirstResponder];
//    bisShowKeyboard = YES;

    // 返回键的类型
    self.textView.returnKeyType = UIReturnKeyDefault;

    // 键盘类型
    self.textView.keyboardType = UIKeyboardTypeDefault;

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchesInTextView:)];

    // 设置成NO表示当前控件响应后会传播到其他控件上,默认为YES。
    tapGestureRecognizer.cancelsTouchesInView = NO;

    // 将触摸事件添加到当前view
    [self.textView addGestureRecognizer:tapGestureRecognizer];
}
- (void)viewDidLoad {
    [super viewDidLoad];

    bisShowKeyboard = NO;                       // 默认不显示键盘

    // 优化textView使用
    [self optimizeTextView];

    .....................
    }
				
时间: 2024-10-10 15:42:33

IOS 键盘的显示与关闭,以及移动显示(UITextView处理完整版)的相关文章

ios 键盘处理

IOS 解决键盘挡住输入框的问题 IQKeyBoardManager http://code4app.com/ios/IQKeyBoardManager/524260bf6803fa7a41000001 完善-- iOS之键盘挡住输入框的解决方法 ios输入框被键盘挡住的解决办法 关于IOS键盘遮住输入框以及关闭的方法. IOS学习笔记36—解决键盘遮挡输入框(UITextField)问题 完美解决ios4与ios5输入框随键盘移动问题 ios 键盘处理,布布扣,bubuko.com

IOS开发之触摸背景关闭键盘的代码实现

直接上代码: // 触摸背景,关闭键盘 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; UIView *view = (UIView *)[touch view]; if (view == self.view) { [weightTextField resignFirstResponder]; } } 以上代码是在一个viewContro

ios ---键盘的监听事件

//在view将要出现的时候重载viewWillAppear方法添加通知 监听事件 keyboardWillShow:  keyboardWillHide: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:

MvvmCross for WPF 支持子窗体显示、关闭、传参

最近在做 PCL(Portable Class Library)平台的项目,所以发一下自己遇到的问题 MvvmCross 是 PCL 平台的一个 MVVM 框架 地址:https://github.com/MvvmCross/MvvmCross 支持的平台: Silverlight for WP7, WP8 Mono for Android (or Xamarin.Android) MonoTouch for iOS (or Xamarin.iOS) the WinRT XAML framewo

iOS 键盘自适应(IQKeyboardManager)使用小结

IQKeyboardManager Github地址 经常在开发一个应用程序,我们遇到了一个问题,iPhone的键盘上滑覆盖的UITextField / UITextView.IQKeyboardManager可以防止键盘滑动问题和覆盖UITextField / UITextView无需你输入任何代码,不需要额外的设置要求.使用IQKeyboardManager你只需要添加源文件到你的项目. 主要特点 1)无代码 2)自动工作 3)没有更多的UIScrollView4)没有更多的子类 5)没有更

IOS键盘样式风格有关设置

一.键盘风格 UIKit框架支持8种风格键盘. typedef  enum  { UIKeyboardTypeDefault,                 // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapable,            // 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation,   // 标准电话键盘,支持+*#等符号 UIKeyboardTypeURL,                     // 

IOS键盘的相关设置(UITextfield)

http://blog.csdn.net/h3c4lenovo/article/details/8447661 一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault,                // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapable,           // 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation,  // 标准电话键盘,

iOS开发- 文件共享(利用iTunes导入文件, 并且显示已有文件)

今天要实现一个功能, 通过iTunes导入文件到应用中, 并且在应用中对这个文件进行编辑. 类似我们平时经常使用的 PDF阅读器那样的东西, 我们可以自己导入我们的电子书. 源码下载:https://github.com/colin1994/iTunesTest.git 下面具体介绍下实现过程. 先看效果图. 图1. 未实现功能前, iTunes截图 图2. 实现功能后, iTunes截图 图3. 实现功能后, 运行截图. 好了, 通过图片, 我们可以看到实现的效果. 功能包括: 允许通过iTu

李洪强iOS开发之-实现点击单行View显示和隐藏Cell

李洪强iOS开发之-实现点击单行View显示和隐藏Cell 实现的效果:  ....