iOS将UITextView嵌套在UITableViewCell中实时更新cell的高度

1、在tableviewcell拖一个UITextView,设置上下左右的约束;

2、记得再给UITextView设置一个大于等于的高度,必须大于0;(注意:因为UITextView顶部有个UILabel和UIButton,而我的UITextView顶部是依据UILabel的底部为约束,所以UILabel要添加一个固定高度的约束

iOS将UITextView嵌套在UITableViewCell中实时更新cell的高度_第1张图片

3、记得把UITextView的Scrolling Enabled设置为false。就是取消勾选(这一点很关键,如果不设置为 NO,UITextView 在内容超出 frame 后,重新设置 text view 的高度会失效,并出现滚动条。

iOS将UITextView嵌套在UITableViewCell中实时更新cell的高度_第2张图片

4、在控制器设置UITableView的默认高度和cell的高度使用自适应高度

//  支持自适应 cell

  self.tableView.estimatedRowHeight = 100;

  self.tableView.rowHeight = UITableViewAutomaticDimension;

5、在UITableViewCell上面,将UITextView的delegat 对象设置为cell上面;

在UITextViewDelegate下面的方法加上刷新的代码

- (void)textViewDidChange:(UITextView *)textView

{

  CGRect bounds = textView.bounds;

  // 计算 text view 的高度

  CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX);

  CGSize newSize = [textView sizeThatFits:maxSize];

  bounds.size = newSize;

  textView.bounds = bounds;

  // 让 table view 重新计算高度

  UITableView *tableView = [self tableView];

// 让 table view 的高度进行刷新,必须要调用以下两个方法

  [tableView beginUpdates];

  [tableView endUpdates];

}

- (UITableView *)tableView

{

  UIView *tableView = self.superview;

  while (![tableView isKindOfClass:[UITableView class]] && tableView) {

    tableView = tableView.superview;

  }

  return (UITableView *)tableView;

}

6、因为tableview滚动的时候的重用机制,会把之前输入的内容给情况,所以在输入的内容的时候,需要把内容给存起来。不会导致内容丢失的情况

 

7、在UITableviewCell中添加一个委托

@protocol TextViewCellDelegate;

@interface TextViewCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UITextView *textView;

@property (weak, nonatomic) id delegate;

@end

@protocol TextViewCellDelegate 

- (void)textViewCell:(TextViewCell *)cell didChangeText:(NSString *)text;

@end

 

8、然后在UITextView的delegate的textViewDidChange中把内容委托出去,让外部进行存储操作

- (void)textViewDidChange:(UITextView *)textView

{

  if ([self.delegate respondsToSelector:@selector(textViewCell:didChangeText:)]) {

    [self.delegate textViewCell:self didChangeText:textView.text];

  }

  // 计算 text view 的高度

  ...

  // 让 table view 重新计算高度

  ...

}

 

9、最后在视图控制器类进行数据的存储

#pragma mark - TextViewCellDelegate

- (void)textViewCell:(TextViewCell *)cell didChangeText:(NSString *)text

{

  NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

  NSMutableArray *data = [self.data mutableCopy];

  data[indexPath.row] = text;

  self.data = [data copy];

}

 

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

  return [self.data count];

}

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  TextViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TextViewCell" forIndexPath:indexPath];

  cell.textView.text = self.data[indexPath.row];

  return cell;

}

你可能感兴趣的:(ios)