首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我的TableViewCell不会根据它内部动态变化的视图来改变高度

TableViewCell是iOS开发中用于展示列表数据的一种视图控件。通常情况下,TableViewCell的高度是固定的,但是当内部的视图动态变化时,需要根据内部视图的内容来动态调整TableViewCell的高度。

为了实现TableViewCell的高度根据内部视图动态变化,可以采用以下步骤:

  1. 在TableViewCell的布局中,将内部视图的约束设置为自适应的约束。这意味着内部视图的高度会根据其内容自动调整。
  2. 在TableViewCell的代码中,重写layoutSubviews方法。在该方法中,调用super.layoutSubviews()来确保父类的布局方法得到执行。然后,更新内部视图的约束,并计算内部视图的高度。
  3. 在TableView的代理方法heightForRowAt中,返回计算得到的TableViewCell的高度。可以使用systemLayoutSizeFitting方法来计算TableViewCell的高度,该方法会根据内部视图的约束自动计算高度。

以下是一个示例代码:

代码语言:txt
复制
class CustomTableViewCell: UITableViewCell {
    // 内部视图
    var dynamicView: UIView!
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        // 创建内部视图
        dynamicView = UIView()
        dynamicView.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(dynamicView)
        
        // 添加内部视图的约束
        dynamicView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
        dynamicView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
        dynamicView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
        dynamicView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        // 更新内部视图的约束
        // ...
        
        // 计算内部视图的高度
        let dynamicViewHeight = dynamicView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
        
        // 更新TableViewCell的高度
        frame.size.height = dynamicViewHeight + 20
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

// 在TableView的代理方法中返回计算得到的TableViewCell的高度
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell
    // 配置TableViewCell的数据
    // ...
    cell.layoutIfNeeded()
    return cell.frame.height
}

这样,当内部视图的内容发生变化时,TableViewCell的高度会自动根据内部视图的大小进行调整。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 史上最全的iOS之访问自定义cell的textField.text的N种方法

    问题背景:自定义cell中有一个UITextField类型的子控件。我们经常要在tableView中拿到某个cell内textField的文本内容进行一些操作。比如某些app的注册界面就是以tableView的形式存在的,注册时往往需要注册姓名、昵称、邮箱、地址、联系方式等信息。然后点击注册或者提交,这些信息就会被提交到远程服务器。有人说,注册页面就那么固定的几行cell,没必要搞得那么复杂,完全可以用静态cell实现。但还有一些情况,当前页面的tableView的cell的行数是不确定的(比如当前页面显示多好行cell由上一个页面决定或者由用户决定),这种情况下不太适合使用静态cell。也不能够通过分支语句的方式一一枚举出各个case。所以需要一中通用的动态的方法。那么我们怎么在tableView中准确的拿到每一行cell中textField的text呢?以下我将要分四个方法分别介绍并逐一介绍他们的优缺点,大家可以在开发中根据实际情况有选择的采用不同的方法。 如下图,就是我之前开发的一个app中用xib描述的一个cell,当用户点击“注册”或者“提交”button时候,我需要在控制器中拿到诸如“法人姓名”这一类的信息:

    04

    深入详解iOS适配技术

    iPhone自诞生以来,随着其屏幕尺寸不断的多样化,屏幕适配的技术一直在发展更新。目前,iOS系统版本已经更新到9.3,XCode的最新版本已经是7.3,仅iPhone历史产品的尺寸就已经有4种:3.5英寸、4.0英寸、4.7英寸、5.5英寸。最近,iPhone家族又诞生一款iPhoneSE,鉴于这款iPhoneSE的屏幕尺寸和iPhone5S的尺寸一模一样——同样是4.0英寸,广大iOS开发者可算是松了口气,不然iOS的屏幕尺寸真的是越来越让人眼花缭乱。 按照时间顺序,屏幕适配是这样发展的:纯代码计算frame-> autoresizing(早期进行UI布局的技术,仅适用于约束父子控件之间的关系)->AutoLayout(iOS6/2012年、iPhone5被引入,比autoresizing更加高级,旨在替代autoresizing,可以设置任何控件之间的关系)->sizeClass(iOS8出现,用于解决越来越多的屏幕尺寸的适配问题)。 在iPhone3gs时代,手机的屏幕尺寸有且只有一种,也就是3.5英寸。开发app的时候,根本不用考虑同一个视图在不同尺寸的屏幕上显示的问题。iOS开发者完全可以用纯代码的方式把一个控件的frame写死。 后来apple公司推出了4.0英寸的iPhone5和iPhone5S,所以,针对于不同尺寸的屏幕,再把控件的frame写死就不可取了。(其实也不是不可取,很多iOS开发者做屏幕适配的时候不是用的autoresizing或autolayout,而是以代码的方式动态获取屏幕的尺寸,然后根据屏幕的尺寸来写死子控件的frame。使用这种方式你会在代码中无辜增加很多if...else... 的条件判断语句。另一种方式是获取到屏幕的尺寸后,按照控件和屏幕的比例来设置控件的frame,其本质上也是写死frame。所以这两种方式都不可取,毕竟将来会回出现越来越多的屏幕尺寸。从开发的角度,重复繁琐的代码会牵绊住开发者的进度;从程序设计角度,这样的设计思路不够高级,且日后不易于拓展和维护。)

    07

    【Unity游戏开发】你真的了解UGUI中的IPointerClickHandler吗?

    马三在最近的开发工作中遇到了一个比较有意思的bug:“TableViewCell上面的某些自定义UI组件不能响应点击事件,并且它的父容器TableView也不能响应点击事件,但是TableViewCell上面的Button等组件却可以接受点击事件,并且如果单独把自定义UI控件放在一个UI上面也可以接受点击事件”。最后马三通过仔细地分析,发现是某些自定义的UI组件实现方法的问题。通常情况下,如果想要一个UI响应点击事件的话,我们只需要实现IPointerClickHandler这个接口就可以了,但是在我们项目中的TableView继承自MonoBehavior,并且实现了IPointerClickHandler, IPointerDownHandler, IPointerUpHandler,IDragHandler等UI接口,此时如果我们的自定义UI组件只实现了IPointerClickHandler接口,而没有实现 IPointerDownHandler 接口,然后又作为TableViewCell里面的一个Child的话,就会出现TableViewCell接收不到点击事件,TableView也接收不到点击事件。点击事件被诡异地“吞没了”!下面我们简单地设计三个不同情况下的模拟测试来复现一下这个bug。

    02
    领券