开始编辑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
{
    // 判断之后点击响应的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的情况,自己想办法解决吧。
新手第一次写博客,请勿喷
0 0
原创粉丝点击