UITextView в UITableViewCell плавного автоматического изменения размера показывает и скрывает клавиатуру на iPad, но работает на iPhone
Я реализовал пользовательский 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's 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/questions/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 не увеличивается до нужной высоты.ОБНОВИТЬ: Следующийэти инструкцииТеперь я могу остановить странное движение текста; но клавиатура все еще прячется и показывает, что очень странно.У кого-нибудь есть идеи относительно того, как заставить клавиатуру непрерывно показывать, а не прятаться и показывать, когда вы доберетесь до конца строки на iPad?
П.С .: Меня не интересует использование ThreeTwenty.