开始编辑textView或者textField时向上推动self.view
来源:互联网 发布:lc32es62数据 编辑:程序博客网 时间:2024/06/10 08:44
当界面中只存在一个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
{
[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");
if ([textView isEqual:self.textView1]) {
// 在这里改变fram
NSLog(@"改变frame");
}
}
// 3、在输入的过程中,如果改变键盘高度后再输入时重新设置frame
- (void)textViewDidChange:(UITextView*)textView
{
// 3、在输入的过程中,如果改变键盘高度后再输入时重新设置frame
- (void)textViewDidChange:(UITextView*)textView
{
// 判断之后点击响应的textView时才会改变fram值
if ([textView isEqual:self.textView1]) {
// 在这里改变fram
NSLog(@"改变frame");
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);
}
//如果点击的是目的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];
{
//获取键盘的高度
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);
}
if ([self.textField1isFirstResponder]) {
// 在这里改变frame
NSLog(@"keyboardHeight = %f",_keyboardHeight);
}
}
// 3、留下个小bug,有可能上面的两个方法都会执行设置frame的情况,自己想办法解决吧。
新手第一次写博客,请勿喷
0 0
- 开始编辑textView或者textField时向上推动self.view
- 编辑textfield是view向上移动
- textField在进行编辑时自动向上,…
- 向上推动门效果
- tableView中的textView 或者textField 的键盘处理
- 小技巧:textfield或者textview中长按出现的(全选,复制,粘贴)显示成中文
- textview textfield 返回
- label textField textview
- textView和textField
- textView/textField限制输入
- TextField、TextView限制字数
- textView、textField键盘遮挡
- 用TPKeyboardAvoiding(Scroll,Collection,Table,text)View避免键盘遮盖住了textfield,textview
- textField和textView同时存在时的键盘监听
- 从fragment开始向上查找实现了某个接口的parent Fragment 或者 Activity
- textField 限制2位小数,编辑时不让键盘挡住
- 自定义View--Label + TextField
- 把textfield或者textview中长按出现的(全选,复制,粘贴) 系统相册等提示语 显示成中文
- oracle11g卸载出错 无法删除文件,文件正在使用中
- POJ 3737 UmBasketella
- poj2778--DNA Sequence(AC自动机+矩阵优化)
- js 小数取整的函数
- 窗体的扩展样式GWL_EXSTYLE: 用于SetWindowLong
- 开始编辑textView或者textField时向上推动self.view
- World Wind Java开发之十一——加载热点信息(仿Google Earth)
- 编程之美-分层遍历二叉树
- JSOUP抓取网页内容
- chan editor 轻量级的带语法高亮的代码编辑器
- WPF中Height和ActualHeight的区别
- 招聘季总结
- NY879大水比
- Codeforces Round #290 D. Fox And Jumping