美文网首页
UITableViewCell 高度随 UITextView 内

UITableViewCell 高度随 UITextView 内

作者: 携YOU手同行 | 来源:发表于2020-04-10 16:30 被阅读0次

    一、需求定义 :

    cell中内容随着输入文字增多或者减少动态变化

    最近项目中有这样的一个需求,用户需要添加备注信息。随着UITextView的内容输入变化,动态的改变cell的高度,但是一般项目中使用的UITextView 如果布局限定了,超出了相关的范围的话,UITextView的内容就会超出tableView 的滚动限制,在UITextView内部上下滚动查看,从而实现不了相应的动态变化。基于这样的问题,在自己查找和相关的研究下,实现了相关的项目需求。从而达到了相应的目的。以上只是自己的实现过程,仅供参考,大神请略过。

    二、实现思路

    布局

    相关tableView的布局实现,这个就不用细说了,相信任何一个iOS开发的都会的,
    关键的是在布局的时候如果把controller设置为uitextView的代理的话,刷新textView变得十分不便,所以这时候布局的时候应该用uitableViewCell 作为 uitextView的代理,从而监听UITextView的内容变化的时候 controller动态的刷新内容,从而不断计算出相关的高度

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
         TableViewInputViewCell * cell = (TableViewInputViewCell *)[tableView.dataSource tableView:_tableView cellForRowAtIndexPath:indexPath];
        if ([cell CellHeight] < 70) {
            
             return 70;
            
        }else{
            
            return [cell CellHeight];
        }
       
    }
    

    在此的时候,可以根据自己的需求设定最小高度,超过这个范围的时候,就会根据输入的内容动态的改变相关输入的高度,如果是删除的时候,如果删除内容高度小于限定高度的时候,会自动保留最小的高度,从而实现项目中的相关根据动态改变高度。

    /**
     控制器成功cell的代理,从而实现刷新方法
     */
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        
        TableViewInputViewCell *cell = [TableViewInputViewCell cellWithTableView:tableView];
        cell.delegate = self;
        cell.indexPath = indexPath;
        cell.tableView = _tableView;
        cell.contentStr= _contentInfoString;
        return cell;
    
    }
    

    控制成为cell的代理过后,需要实现cell的协议方法,从而控制才能根据内容计算实时的高度

    #pragma mark ------TableViewInputViewCellDelegate
    /**
     刷新内容,控制器根据内容去计算相关的高度
     */
    -(void)updatedText:(NSString *)text atIndexPath:(NSIndexPath *)indexPath
    {
        _contentInfoString = text;
    
    }
    

    cell的实现过程

    cell成为uitextView的代理,从而可以根据uitextViewDelegate下的改变输入方法来告知控制内容发生改变,然后根据tableView的 beginUpdates 和 endUpdates 从而完成一个跟新过程,从而实现一整套连贯的相关通知方法,具体的实现就不多说了,在输入的时候动态的改变相关的控件变化的相关高度,

    /**
     输入内容改变的时候,实现刷新相关高度
     */
    -(void)updateTheTextHeight
    {
        if ([self.delegate respondsToSelector:@selector(updatedText:atIndexPath:)]) {
               [self.delegate updatedText:_infoTextView.text atIndexPath:_indexPath];
           }
           
           CGRect frame = _infoTextView.frame;
           CGSize constraintSize = CGSizeMake(frame.size.width, MAXFLOAT);
           CGSize size = [_infoTextView sizeThatFits:constraintSize];
           _bottomView.frame = CGRectMake(0, 0, k_ScreenWidth, self.contentView.frame.size.height);
           _infoTextView.frame = CGRectMake(15, 10, k_ScreenWidth - 30, _bottomView.frame.size.height - 20);
         
        [_tableView beginUpdates];
        [_tableView endUpdates];
        
        
    }
    

    总结

    这是本人实现的相关过程,本人实现的Demo地址是:https://github.com/zouyaya/AutoChangInputHeight
    相关的实现思路大概就是这样,如果有什么问题还请各位大神多多指教,

    相关文章

      网友评论

          本文标题:UITableViewCell 高度随 UITextView 内

          本文链接:https://www.haomeiwen.com/subject/jduauhtx.html