在静态表格视图中dynamic调整文本视图和表格视图单元格的大小

我有一个静态表视图,我正在使用作为我的应用程序的数据inputsot。 其中一个单元格中有一个UITextView,它需要随着用户的input而dynamic增长和缩小,以及逻辑上随着单元格的增长/收缩。 我读了一堆这个post,但我想我正在被抛出,因为我正在使用一个STATIC表视图。

这里是我resize的尝试(它几乎总是失败):

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

我会采取任何提示! 谢谢。

你不必做任何事情,只需要通过这个代码: – 有一个新的函数来取代sizeWithFont,这是boundingRectWithSize。

将下面的函数添加到我的项目中,该项目使用iOS7上的新function和iOS上的旧function,它们的大小与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 } } 

您可以在项目中的prefix.pch文件中添加IOS_NEWER_OR_EQUAL_TO_7,如下所示:

 #define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 ) 

我从这个链接提到:

UITableViewCell与iOS 7中的UITextView高度?

请检查我的答案。

计算UITableViewCell高度以适合string

这里标签用来计算单元格的高度。

当你在textfield中编辑Text时- (void)textViewDidEndEditing:(UITextView *)textView调用tableview的reloadData函数来更新单元格

你将需要手动计算你的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的底部约束。 只设置右,左和顶。

Interesting Posts