开始编辑textView或者textField时向上推动self.view
2015-02-03 17:09
337 查看
当界面中只存在一个textView或者textField时可以直接在监听键盘keyboardWillChanged:方法中改变self.view的frame就可以了。如果同一个界面中存在多个textView或者textField,当我们点击最下面的一个时改变self.view的frame,此时在监听键盘的方法中不能通过很好的区分不同的控件来达到点击最下面的控件时改变frame的目的(因为如果在keyboardWillChanged:方法中通过[textfield1
isFirstResponder]来判断是哪个控件为第一响应者的话也是不完善的,因为当我们在几个textfield之间来回点击切换时,键盘弹出的方法只会在调用一次。这样的话我们先点击上面的textField,然后再点击最先面的textField就监控不到了)。下面我们分别说明在一个界面中存在多个textView或者textField时,点击最下面的一个textView或者textField时调整self.view的frame的方法:
一、如果最下面的控件为textView时比较容易
- (void)viewDidLoad {
[superviewDidLoad];
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(keyboardWillChanged:)name:UIKeyboardWillChangeFrameNotificationobject:nil];
}
// 1、点击输入控件时,首先会调用监听键盘的方法,然后再调用textView的代理方法,此时键盘的高度赋值给_keyboardHeight,用来给第2步开始编辑时改变frame时使用
- (void)keyboardWillChanged:(NSNotification*)aNotification
{
//获取键盘的高度
NSDictionary *userInfo = [aNotificationuserInfo];
NSValue *aValue = [userInfoobjectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValueCGRectValue];
int height = keyboardRect.size.height;
_keyboardHeight = height;
}
// 2、当textView开始编辑时,使用在前面监听键盘的方法中获取到的键盘的高度来设置frame
- (void)textViewDidBeginEditing:(UITextView*)textView
{
//
判断之后点击响应的textView时才会改变fram值
if ([textView
isEqual:self.textView1])
{
//
在这里改变fram
NSLog(@"改变frame");
}
}
// 3、在输入的过程中,如果改变键盘高度后再输入时重新设置frame
- (void)textViewDidChange:(UITextView*)textView
{
//
判断之后点击响应的textView时才会改变fram值
if ([textView
isEqual:self.textView1])
{
//
在这里改变fram
NSLog(@"改变frame");
}
}
二、如果最下面的控件为textField时
// 1、点击textField时首先会调用textField的代理方法,然后再调用监听键盘的方法。如果是第一次点击该textField弹出键盘时,此时该方法中取到的keyboardHieght为0,不会改变frame值,因此我们需要在第2步键盘监控方法中判断是否点击了目的控件,如果是的话就设置frame.所以说这两个方法是相辅相成的。
- (void)textFieldDidBeginEditing:(UITextField*)textField{
//如果点击的是目的textField,就调整frame
if ([self.textField1isFirstResponder])
{
//
在这里改变frame
NSLog(@"keyboardHeight = %f",_keyboardHeight);
}
}
// 2、键盘盖度改变时调用的方法,因为如果有几个textView或者textField的话,我们在其中切换时键盘的状态不会改变,所以我们只能监控到第一次点击控件弹出键盘的操作。所以如果是首先点击上面的输入控件,然后再切换到最下面的目的textField时,就不会调用该方法了,所以我们需要在第1步中的textField的代理方法中判断,如果是目的控件的话就设置frame.所以说这两个方法是相辅相成的。
- (void)keyboardWillChanged:(NSNotification*)aNotification
{
//获取键盘的高度
NSDictionary *userInfo = [aNotificationuserInfo];
NSValue *aValue = [userInfoobjectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValueCGRectValue];
int height = keyboardRect.size.height;
_keyboardHeight = height;
//
如果点击的是目的textField,就调整frame
if ([self.textField1isFirstResponder])
{
//
在这里改变frame
NSLog(@"keyboardHeight = %f",_keyboardHeight);
}
}
// 3、留下个小bug,有可能上面的两个方法都会执行设置frame的情况,自己想办法解决吧。
新手第一次写博客,请勿喷
isFirstResponder]来判断是哪个控件为第一响应者的话也是不完善的,因为当我们在几个textfield之间来回点击切换时,键盘弹出的方法只会在调用一次。这样的话我们先点击上面的textField,然后再点击最先面的textField就监控不到了)。下面我们分别说明在一个界面中存在多个textView或者textField时,点击最下面的一个textView或者textField时调整self.view的frame的方法:
一、如果最下面的控件为textView时比较容易
- (void)viewDidLoad {
[superviewDidLoad];
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(keyboardWillChanged:)name:UIKeyboardWillChangeFrameNotificationobject:nil];
}
// 1、点击输入控件时,首先会调用监听键盘的方法,然后再调用textView的代理方法,此时键盘的高度赋值给_keyboardHeight,用来给第2步开始编辑时改变frame时使用
- (void)keyboardWillChanged:(NSNotification*)aNotification
{
//获取键盘的高度
NSDictionary *userInfo = [aNotificationuserInfo];
NSValue *aValue = [userInfoobjectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValueCGRectValue];
int height = keyboardRect.size.height;
_keyboardHeight = height;
}
// 2、当textView开始编辑时,使用在前面监听键盘的方法中获取到的键盘的高度来设置frame
- (void)textViewDidBeginEditing:(UITextView*)textView
{
//
判断之后点击响应的textView时才会改变fram值
if ([textView
isEqual:self.textView1])
{
//
在这里改变fram
NSLog(@"改变frame");
}
}
// 3、在输入的过程中,如果改变键盘高度后再输入时重新设置frame
- (void)textViewDidChange:(UITextView*)textView
{
//
判断之后点击响应的textView时才会改变fram值
if ([textView
isEqual:self.textView1])
{
//
在这里改变fram
NSLog(@"改变frame");
}
}
二、如果最下面的控件为textField时
// 1、点击textField时首先会调用textField的代理方法,然后再调用监听键盘的方法。如果是第一次点击该textField弹出键盘时,此时该方法中取到的keyboardHieght为0,不会改变frame值,因此我们需要在第2步键盘监控方法中判断是否点击了目的控件,如果是的话就设置frame.所以说这两个方法是相辅相成的。
- (void)textFieldDidBeginEditing:(UITextField*)textField{
//如果点击的是目的textField,就调整frame
if ([self.textField1isFirstResponder])
{
//
在这里改变frame
NSLog(@"keyboardHeight = %f",_keyboardHeight);
}
}
// 2、键盘盖度改变时调用的方法,因为如果有几个textView或者textField的话,我们在其中切换时键盘的状态不会改变,所以我们只能监控到第一次点击控件弹出键盘的操作。所以如果是首先点击上面的输入控件,然后再切换到最下面的目的textField时,就不会调用该方法了,所以我们需要在第1步中的textField的代理方法中判断,如果是目的控件的话就设置frame.所以说这两个方法是相辅相成的。
- (void)keyboardWillChanged:(NSNotification*)aNotification
{
//获取键盘的高度
NSDictionary *userInfo = [aNotificationuserInfo];
NSValue *aValue = [userInfoobjectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValueCGRectValue];
int height = keyboardRect.size.height;
_keyboardHeight = height;
//
如果点击的是目的textField,就调整frame
if ([self.textField1isFirstResponder])
{
//
在这里改变frame
NSLog(@"keyboardHeight = %f",_keyboardHeight);
}
}
// 3、留下个小bug,有可能上面的两个方法都会执行设置frame的情况,自己想办法解决吧。
新手第一次写博客,请勿喷
相关文章推荐
- iOS【textView或者textField文本输入字数限制】
- tableView中的textView 或者textField 的键盘处理
- self.modifyContentTextField.delegate = self; 这句话要放在viewdidload 里, 不能放init里。。
- UIScrollView的妙用---textfield编辑不被键盘遮盖(方便简单好实现@.@)
- 把textfield或者textview中长按出现的(全选,复制,粘贴) 系统相册等提示语 显示成中文
- 如何把textfield或者textview中长按出现的(全选,复制,粘贴)显示成中文
- 在textFieldShouldEndEditing 方法中调用[self.tableView reloadData] 失效问题
- (多码伤眼,伤身,伤脑,勿入)代码写界面(3*label,2*textFIeld,1*slider,2*UISwitch,1*segmentedController,1*button,1*AlertSheet,1*AlertView)
- 编辑控件的警告提示是:This text field does not specify an inputType or a hint
- 当TextView或者EditView的内容发生变化时,其他组件及时给予响应时,我们可以使用TextWatcher来实现。
- 关于textView,textField及delegate的应用
- 自动完成可编辑文本AutoCompleteTextView的使用
- android中给TextView或者Button的文字添加阴影效果
- flash 游戏设计笔记:TextField确定一个坐标位置,坐标位置不动,文本是向上增长。
- textview可编辑
- Android TextView文字底部或者中间 加横线
- <转>textView return 键盘 textfield 键盘
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android中TextView中加图片,超链接,部分字或者背景变色。。。
- Android之TextView实现文字过长时省略部分或者滚动显示