问题
需求:
1.项目中UITableView
的cell嵌套了UITextView
2.根据UITextView
里面的文字的长度自动适应高度
这就难免使用UITableView
的- (void)reloadData;
或者是- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
但是非常不幸
一调用- (void)reloadData;
会调用resignFirstResponder
会导致键盘的退出,给用户造成非常不好的体验.
解决方法:
使用
[self.tableView beginUpdates];
[self.tableView endUpdates];
来替换 reloadData
可以完美调用-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
,但是不引发resignFirstResponder
最后附上部分示例代码:
WEAK_OBJECT(model);
cell.textViewTextChanged = ^(NSString *text, UITextView *sender) {
STRONG_OBJECT(model);
CGFloat width = (SCREEN_WIDTH - 20 - 100);
CGFloat height = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: FONT(14)} context:nil].size.height;
model.key_value = text;
if (self.preViewH != ceil(height)) {
self.preViewH = ceil(height);
//原先使用
// [self.tableView reloadData];
//替换成
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
};
网友评论