2013-09-05 2 views
0

Я пытаюсь изменить размер UITextView, когда клавиатура открыта.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; 
} 

+0

На ваших NSLog результатами, показанными являются ожидаемым? – CoderPug

+0

Nop, в моих уравнениях что-то не хватает, потому что я никогда не получаю нужный размер –

ответ

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; 
    } 

Отредактировано

Общая формула для также поддерживает режим Landscape

- (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

+0

Это 2 строки слишком большие –

+0

На самом деле, это отлично работает на iOS6, но не iOS 7: S –

+0

Где твоя 'информация'? Я только отредактировал мой ответ – CoderPug

Смежные вопросы