Я внедрил пользовательский UITableViewCell, который включает UITextView, который автоматически изменяет размер, как пользовательский тип, аналогично полю "Примечания" в приложении "Контакты". Он работает правильно на моем iPhone, но когда я тестирую его в iPad, я получаю очень странное поведение: когда вы добираетесь до конца строки, клавиатура скрывается за миллисекунду, а затем снова показывает себя снова. Я бы назвал это просто причудливой ошибкой, но на самом деле это приводит к некоторой потере данных, поскольку, если вы печатаете, она теряет символ или два. Здесь мой код:
Код
// returns the proper height/size for the UITextView based on the string it contains.
// If no string, it assumes a space so that it will always have one line.
- (CGSize)textViewSize:(UITextView*)textView {
float fudgeFactor = 16.0;
CGSize tallerSize = CGSizeMake(textView.frame.size.width-fudgeFactor, kMaxFieldHeight);
NSString *testString = @" ";
if ([textView.text length] > 0) {
testString = textView.text;
}
CGSize stringSize = [testString sizeWithFont:textView.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
return stringSize;
}
// based on the proper text view size, sets the UITextView frame
- (void) setTextViewSize:(UITextView*)textView {
CGSize stringSize = [self textViewSize:textView];
if (stringSize.height != textView.frame.size.height) {
[textView setFrame:CGRectMake(textView.frame.origin.x,
textView.frame.origin.y,
textView.frame.size.width,
stringSize.height+10)]; // +10 to allow for the space above the text itself
}
}
// as per: https://stackoverflow.com/info/3749746/uitextview-in-a-uitableviewcell-smooth-auto-resize
- (void)textViewDidChange:(UITextView *)textView {
[self setTextViewSize:textView]; // set proper text view size
UIView *contentView = textView.superview;
// (1) the padding above and below the UITextView should each be 6px, so UITextView's
// height + 12 should equal the height of the UITableViewCell
// (2) if they are not equal, then update the height of the UITableViewCell
if ((textView.frame.size.height + 12.0f) != contentView.frame.size.height) {
[myTableView beginUpdates];
[myTableView endUpdates];
[contentView setFrame:CGRectMake(0,
0,
contentView.frame.size.width,
(textView.frame.size.height+12.0f))];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
int height;
UITextView *textView = myTextView;
[self setTextViewSize:textView];
height = textView.frame.size.height + 12;
if (height < 44) { // minimum height of 44
height = 44;
[textView setFrame:CGRectMake(textView.frame.origin.x,
textView.frame.origin.y,
textView.frame.size.width,
44-12)];
}
return (CGFloat)height;
}
Проблемы
Итак, вот что происходит
- Этот код работает на 100% правильно на моем iPhone и в симуляторе iPhone. Когда я печатаю текст, UITextView растет плавно, а UITableViewCell вместе с ним.
- На симуляторе iPad, однако, он становится виноватым. Он отлично работает, когда вы печатаете на первой строке, но когда вы добираетесь до конца строки, клавиатура исчезает, а затем снова появляется сразу, поэтому, если пользователь продолжает набирать приложение, пропускает символ или два.
- Вот некоторые дополнительные замечания о странных поведенческих поведениях, которые я заметил, которые могут помочь объяснить это:
- Кроме того, я обнаружил, что удаление строк
[myTableView beginUpdates]; [myTableView endUpdates];
в функцииtextViewDidChange:(UITextView *)textView
заставляет UITextView правильно расти, а также не отображает и не скрывает клавиатуру, но, к сожалению, UITableViewCell не подходит к правильному высота. - UPDATE: Следуя этим инструкциям, теперь я могу остановить странное движение текста; но клавиатура все еще скрывается и отображается, что очень странно.
- Кроме того, я обнаружил, что удаление строк
Есть ли у кого-нибудь идеи о том, как заставить клавиатуру постоянно показывать, а не скрывать и показывать, когда вы дойдете до конца строки на iPad?
P.S.: Я не заинтересован в использовании ThreeTwenty.