键盘打开计算时,UITextView会调整大小

时间:2013-09-05 16:54:48

标签: ios objective-c cocoa-touch

我正在尝试在键盘打开时调整UITextView的大小。

为了给我的UITextView一个新的尺寸(这样它不会被键盘遮挡)我做了以下计算

firstResult = UITextView bottom coordinate - keyboard top coordinate

firstResult现在应该具有阴影UITextView frame

的大小

然后我做textView.frame.size.height -= firstResult现在应该有一个不会被键盘遮蔽的新尺寸。

代码的问题在于它总是隐藏在键盘后面的UIView的一部分。

有人能指出我的计算有什么问题,以便新的尺寸总是正确的吗?或者我可以用来适当调整UITextView大小的任何其他方式,因为我在网上找到的所有例子都不能以某种方式工作。

代码

- (void)keyboardWasShown:(NSNotification *)notification {
CGRect viewFrame = input.frame;
    CGFloat textEndCord = CGRectGetMaxY(input.frame);
    CGFloat kbStartCord = input.frame.size.height - ([[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]).size.height;

    CGFloat result = fabsf( input.frame.size.height - fabsf( textEndCord - kbStartCord ));
    viewFrame.size.height -= result;
    NSLog(@"Original Height:%f, TextView End Cord: %f, KB Start Cord: %f, resutl: %f, the sum: %f",input.frame.size.height, textEndCord,kbStartCord,result,fabsf( textEndCord - kbStartCord ));
    input.frame = viewFrame;
}

1 个答案:

答案 0 :(得分:4)

计算出现问题,请改为尝试,

    - (void)keyboardWasShown:(NSNotification *)notification {
        CGRect viewFrame = input.frame;
        CGFloat textEndCord = CGRectGetMaxY(input.frame);
        CGFloat kbStartCord = textEndCord - ([[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]).size.height;
        viewFrame.size.height = kbStartCord;
        input.frame = viewFrame;
    }

已修改

通用公式也适用于支持横向模式

- (void)keyboardWasShown:(NSNotification *)notification {

    CGFloat keyboardHeight;
    CGRect viewFrame = textView.frame;
    CGFloat textMaxY = CGRectGetMaxY(textView.frame);
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
        keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.width;
    } else {
        keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
    }
    CGFloat maxVisibleY = self.view.bounds.size.height - keyboardHeight;
    viewFrame.size.height = viewFrame.size.height - (textMaxY - maxVisibleY);
    textView.frame = viewFrame;
}

我必须添加UIInterfaceOrientationIsLandscape条件,因为[[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;在设备处于横向状态时不起作用。我知道这有点棘手,另一种解决方法是检测设备旋转和更改参数值。这取决于你。

公式解释

enter image description here