先看最终效果图:
本来想在网上找的,结果发现还没人提供demo,一般都做一种效果,cell高度自适应或者键盘吸附,像我要的这种效果没找到,没办法,我只能自己撸了.
其实实现并不难,主要注意以下几点
1. cell中的textView要用约束设置(我用的Masonary) 高度的约束要撑满
1 [textView mas_makeConstraints:^(MASConstraintMaker *make) { 2 make.left.equalTo(self.titleLbl.mas_right).offset(10); 3 make.top.equalTo(self).offset(10); 4 make.bottom.equalTo(self).offset(-10); 5 make.right.equalTo(self).mas_offset((-20)); 6 }];
2. 设置tableView的rowHeight属性为 UITableViewAutomaticDimension 并且给 estimatedRowHeight 赋值 给一个估算的高度
// 设置可变的cell高度,系统自动计算 _tableView.rowHeight = UITableViewAutomaticDimension; _tableView.estimatedRowHeight = 45;
3. 在自定义cell中实现textView文字改变的代理 并且添加键盘的弹出,收起的通知
1 -(void)addNotificationKeyBoard{ 2 3 [[NSNotificationCenter defaultCenter]addObserver:self 4 selector:@selector(keyBoardShow:) 5 name:UIKeyboardWillShowNotification object:nil]; 6 7 [[NSNotificationCenter defaultCenter]addObserver:self 8 selector:@selector(keyBoardHidden:) 9 name:UIKeyboardWillHideNotification object:nil]; 10 11 } 12 13 - (void)dealloc { 14 15 [[NSNotificationCenter defaultCenter] removeObserver:self]; 16 }
1 #pragma mark - textView delegate 2 - (void)textViewDidChange:(UITextView *)textView { 3 // 通过代理 保存textView的内容,确保不被复用 4 if ([self.delegate respondsToSelector:@selector(textView:didChangeText:)]) { 5 [self.delegate textView:self didChangeText:textView.text]; 6 } 7 CGRect bounds = textView.bounds; 8 CGRect oldBounds = textView.bounds; 9 // 计算 text view 的高度 10 CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX); 11 CGSize newSize = [textView sizeThatFits:maxSize]; 12 // 让 table view 重新计算高度 13 UITableView *tableView = [self tableView]; 14 bounds.size = newSize; 15 textView.bounds = bounds; 16 // 当textView的高度改变的时候刷新cell高度 17 if (oldBounds.size.height != newSize.height) { 18 [tableView beginUpdates]; 19 [tableView endUpdates]; 20 } 21 //cell 高度增加时候 改变contenOffset 22 if (oldBounds.size.height < newSize.height ) { 23 [tableView layoutIfNeeded]; 24 CGFloat height = newSize.height - oldBounds.size.height; 25 [UIView animateWithDuration:.2 animations:^{ 26 tableView.contentOffset = CGPointMake(0, tableView.contentOffset.y + height); 27 }]; 28 } 29 } 30 31 #pragma mark - keyBoard Notification 32 33 - (void)keyBoardHidden:(NSNotification *)notifi{ 34 // 恢复tableView的Y值 35 [UIView animateWithDuration:.2 animations:^{ 36 [self tableView].top = 0; 37 }]; 38 } 39 40 -(void)keyBoardShow:(NSNotification *)notifi{ 41 // 过滤textView 拿到当前响应的textView 42 if (![self.textView isFirstResponder]) return; 43 // 获取键盘高度 44 float height = [[notifi.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; 45 // 获取textView的位置 转换为keyWidow的坐标 46 CGRect rect = [self.textView convertRect:self.textView.bounds toView:[UIApplication sharedApplication].keyWindow]; 47 CGFloat locationY = CGRectGetMaxY(rect); 48 49 // 键盘遮住cell的时候改变tableView的Y值 50 if (locationY > (SHEIGHT - height)) { 51 [UIView animateWithDuration:.2 animations:^{ 52 [self tableView].top -= (height + locationY- SHEIGHT); 53 }]; 54 } 55 }
最后想看demo的小伙伴 请进传送门 https://github.com/YH-Coding/TextViewCellDemo
如果有不懂的,有更好的实现方案或是发现bug欢迎留言讨论
如果对你有帮助的话,欢迎Star哦~~ Thanks♪(・ω・)ノ
end