Изменение размера текстового представления и ячейки табличного представления в статическом табличном представлении
У меня есть статическое табличное представление, которое я использую как ввод данных для моего приложения. В одной из этих ячеек имеется UITextView, который должен динамически увеличиваться и уменьшаться по мере ввода пользователем данных, а также логически увеличивать / уменьшать ячейку. Я прочитал кучу постов на эту тему, но мне кажется, что меня бросают, потому что я использую STATIC табличное представление.
Вот моя попытка изменения размера (почти полный провал):
- (void)textViewDidChange:(UITextView *)textView
{
self.numberOfLines = (textView.contentSize.height / textView.font.lineHeight) - 1;
float height = 44.0;
height += (textView.font.lineHeight * (self.numberOfLines - 1));
CGRect textViewFrame = [textView frame];
textViewFrame.size.height = height - 10.0; //The 10 value is to retrieve the same height padding I inputed earlier when I initialized the UITextView
[textView setFrame:textViewFrame];
[self.tableView beginUpdates];
[self.tableView endUpdates];
[self.messageTextView setContentInset:UIEdgeInsetsZero];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
float height = 44.0;
if (self.messageTextView) {
height += (self.messageTextView.font.lineHeight * (self.numberOfLines - 1));
}
return height;
}
Я возьму любые советы! Благодарю.
3 ответа
Вам не нужно ничего делать, просто пройдите этот код:- Есть новая функция для замены sizeWithFont, которая является boundingRectWithSize.
Добавьте в мой проект следующую функцию, которая использует новую функцию на iOS7 и старую на iOS ниже 7. Она имеет в основном тот же синтаксис, что и sizeWithFont:
-(CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
if(IOS_NEWER_OR_EQUAL_TO_7){
NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
font, NSFontAttributeName,
nil];
CGRect frame = [text boundingRectWithSize:size
options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
attributes:attributesDictionary
context:nil];
return frame.size;
}else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return [text sizeWithFont:font constrainedToSize:size];
#pragma clang diagnostic pop
}
}
Вы можете добавить это IOS_NEWER_OR_EQUAL_TO_7 в ваш файл prefix.pch в вашем проекте как:
#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )
Я ссылался по этой ссылке:-
Пожалуйста, проверьте мой ответ.
Вычислить высоту UITableViewCell, чтобы соответствовать строке
Здесь метка используется для расчета высоты ячейки.
Когда вы закончите с редактированием текста в текстовом поле - (void)textViewDidEndEditing:(UITextView *)textView
позвонить в стол reloadData
функция для обновления ячейки согласно тексту, введенному в textview
Вам нужно будет вручную рассчитать новый размер вас textView
и вручную вызвать обновление для вашего tableView
,
static CGFloat cellHeight = 85;//from story board height to
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
if (indexPath.row == 0) {
return cellHeight + [self appendTextViewNewHeight];
}
return cell.bounds.size.height;
}
-(CGFloat) appendTextViewNewHeight {
return _appendHeightForTextView;
}
static CGFloat textViewHeightStartHeight = 33;//from storiboard height
- (void)textViewDidChange:(UITextView *)textView;
{
CGFloat fixedWidth = textView.frame.size.width;
CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
CGRect newFrame = textView.frame;
newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
if (newFrame.size.height >= textViewHeightStartHeight) {
CGFloat newAppend = newFrame.size.height - textViewHeightStartHeight;
if (newAppend != self.appendHeightForTextView) {
self.appendHeightForTextView = newAppend;
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
}
}
Также вам нужно установить делегатов на раскадровки в коде. в viedDidLoad вам нужно сделать следующее:
self.appendHeightForTextView = 0;
И, наконец, установите ограничения в раскадровке для вашей ячейки. Не устанавливайте нижнее ограничение вашего textView. Устанавливайте только справа, слева и сверху.