先看最終效果圖:git
原本想在網上找的,結果發現還沒人提供demo,通常都作一種效果,cell高度自適應或者鍵盤吸附,像我要的這種效果沒找到,沒辦法,我只能本身擼了.github
其實實現並不難,主要注意如下幾點ide
1. cell中的textView要用約束設置(我用的Masonary) 高度的約束要撐滿spa
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 賦值 給一個估算的高度3d
// 設置可變的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/TextViewCellDemocode
若是有不懂的,有更好的實現方案或是發現bug歡迎留言討論server
若是對你有幫助的話,歡迎Star哦~~ Thanks♪(・ω・)ノblog
endrem