Я не нашел ни одного решения, которое бы работало на меня в сети. После нескольких дней поисков в Google и экспериментов, я наконец-то выпустил этот документ с хорошей прибылью. Это сложная ошибка в Apple iPhone, как вы увидите в конце этого поста.
Если вы столкнулись с такой проблемой, как я, то:
с размером ячейки таблицы больше половины экрана iphone (не путайте с примерами Apple UICatalog с короткой ячейкой таблицы менее 50 точек, здесь не применимо),
имеющий более одного поля uitex в ячейке или комбинацию поля uitextview и uitextview или uiwebview в ячейке,
Нажатие между полями uitextview и uitextview или uiwebview приводит к непредсказуемой позиции прокрутки, либо выбранное поле uitext выскакивает из поля зрения или закрывается клавиатурой. Он работает только в первый раз, когда клавиатура появляется в ячейке просмотра таблицы и впоследствии не работает правильно.
У меня был главный прорыв после прочтения постов, похожих на этот: http://alanduncan.net/old/index.php?q=node/13 Они также не поняли это полностью правильно. Боль вызвана ошибкой в событиях UIKeyboard. Когда клавиатура появляется впервые, она выдает UIKeyboardWillShowNotification и UIKeybaordDidShowNotification. Theree - это ошибка в iPhone, которая так или иначе первая UIKeyboardWillShowNotification отличается от последующей UIKeyboardWillShowNotification. Решение - НАБЛЮДАТЬ UIKeyboardDidShowNotification. Поэтому, когда появится ваша ячейка, добавьте следующий код
NSNotificationCenter*nc=[NSNotificationCenter defaultCenter];
[nc addObserver:self selectorselector(keyboardDidShow name:UIKeyboardDidShowNotification object:self.window];
В функции keyboardDidShow нам нужно прокручивать TABLEVIEW, а не ячейку просмотра таблицы, как предложено в посте выше. Или вы можете видеть, как различные объекты идут по-разному, а не прокручиваются вместе одним куском.
(void)keyboardDidShow:(NSNotification *)notif
{
//1. see which field is calling the keyboard
CGRect frame;
if([textField_no1 isFirstResponder])
frame=textField_no1.frame;
else if([textField_no2 isFirstResponder])
frame=textField_no2.frame;
else if([textField_no3 isFirstResponder])
frame=textField_no3.frame;
else if([textView isFirstResponder])
frame=textView.frame;
else return;
CGRect rect=self.superview.frame;
//2. figure out how many pixles to scroll up or down to the posistion set by theKeyBoardShowUpHorizon.
//remove the complexity when the tableview has an offset
[((UITableView*)[self.superview).setContentOffset:CGPointMake(0,0) animated:YES];
int pixelsToMove=rect.origin.y+ frame.origin.y-theKeyBoardShowUpHorizon;
//3. move the uitableview, not uitableviewcell
[self moveViewUpOrDownByPixels:pixelsToMove];
}
- (void)moveViewUpOrDownByPixels:(int)pixels
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.6];
//find the position of the UITableView, the superView of this tableview cell.
CGRect rect=self.superview.frame;
//moves tableview up (when pixels >0) or down (when pixels <0)
rect.origin.y -= pixels;
rect.size.height += pixels;
self.superview.frame = rect;
[UIView commitAnimations];
}
Чтобы восстановить tableView назад, вам нужно добавить наблюдателя в UIKeyboardDidHideNotification (а не в UIKeyboardWillHideNotification, как это предлагается в других публикациях, чтобы избежать мерцания), где ваш tableviewcell появляется каждый раз, и вернуть представление таблицы туда, где оно было.
[nc addObserver:self selectorselector(keyboarDidHide) name:UIKeyboardDidHideNotification object:nil];
- (void)keyboardDidHideNSNotification*)notif
{
//we have moved the tableview by number of pixels reflected in (self.superview.frame.origin.y). We need to move it back
[self moveViewUpOrDownByPixels:self.superview.frame.origin.y];
}
Не забудьте удалить оба наблюдателя, когда ваша ячейка исчезнет с помощью [[NSNotificationCenter defaultCenter] removeObserver: ...
Это все, что нужно. Я надеюсь, что команда Apple iPhone однажды решит эту проблему, возможно, через 4.0 через несколько месяцев.