iOS textViewCell高度根據textView內容動態改變,並實現鍵盤吸附功能

先看最終效果圖: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

相關文章
相關標籤/搜索