UITableViewCell 具有基于宽度的固有高度

2023-12-26

所以我制作了自定义视图 ExpressionView 来可视化数学表达式。表达式的每一部分都是 UILabel,保存一个数字或运算,并且标签在 ExpressionView 内以右对齐的行对齐。我希望 ExpressionView 具有由外部自动布局约束定义的宽度,但高度应该是固有的,具体取决于我必须为给定宽度制作多少行标签。

对齐方法效果很好,我使用每个标签的frame.size和ExpressionView的宽度,进行数学计算,设置标签的框架位置,并计算包含所有行所需的高度。我还定义了这些,以便设置内在大小,并在每次 ExpressionLabel 宽度变化时重新布局标签:

        override var intrinsicContentSize: CGSize {
            let res = CGSize(width: UIView.noIntrinsicMetric,
                         height: CGFloat(self.contentHeight) //counted during self.layoutAllLabels()
            )

            return res
       }
       
        public override func layoutSubviews() {
            super.layoutSubviews() //finish layout to get current label sizes and self width 
            let preHeight = self.contentHeight
            self.layoutAllLabels() //layout all labels in current width, count required height
    
            //if required height changed, relayout everything
            if (preHeight != self.contentHeight) {
                self.invalidateIntrinsicContentSize()
                self.superview?.setNeedsLayout()
                self.superview?.layoutIfNeeded()
            }
        }

当在普通 UIView 中通过自动布局约束设置 ExpressionLabel 时,一切都会正常工作。但是当 ExpressionLabel 固定在 UITableViewCell 的 contentView 内部时它会失败,并且我希望它定义单元格的高度。我的 UITableView 有自动调整单元格大小所需的这些行

        self.estimatedRowHeight = 50
        self.rowHeight = UITableView.automaticDimension

单个单元格的大小以某种方式发生并且通常是正确的,但通常也会给出无效的高度。它可能与单元重用(通过 dequeueReusableCells())有关,因为旧的高度可能保留在重用的单元中。但是,当它们应该在任何 ExpressionView.layoutSubviews() 调用中更新时,为什么它们没有更新呢?在 UITableView 中创建单元格时是否不会自动布局?如果没有,在哪里布局我的标签,以便它即使在 UITableView 中也能正确更新?当我知道最终单元格宽度,并可以根据它调整其子视图的固有高度时?


知道了!似乎自动尺寸化 UITableViewCell 的高度是通过调用从 UITableView 确定的systemLayoutSizeFitting()的细胞。在我的单元类中,我重写了该方法,并在调用 super.systemLayoutSizeFitting() 之前调用 layoutIfNeeded() - 为了获得正确的尺寸。那行得通!也许我什至可以直接调用ExpressionView排列方法,而不是通过layoutIfNeeded(),但我会保持原样。

这是我的单元类中的覆盖:

    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
        
        //force layout of all subviews including ExpressionView, which
        //updates ExpressionView's intrinsic height, and thus height of a cell
        self.setNeedsLayout()
        self.layoutIfNeeded() 
        
        //now intrinsic height is correct, so I can call super method
        return super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority)
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UITableViewCell 具有基于宽度的固有高度 的相关文章

随机推荐

  • Django Forms clean() 方法 - 需要客户端的 IP 地址

    我正在重写 Django 表单上的 clean 方法 我想要访问客户端的 IP 地址 假设这是绑定表单 如果我有对请求对象的引用 我可以从 META REMOTE ADDR 轻松获取它 但是 我没有参考该请求 关于如何做到这一点有什么想法吗
  • 如何在 Keras 中实现自适应损失?

    我正在尝试使用 Keras 来实现中完成的工作通用的自适应鲁棒损失函数 https arxiv org abs 1701 03077 作者提供了处理困难细节的张量流代码 我只是想在 Keras 中使用他的预构建函数 他的自定义损失函数正在学
  • 是否可以收听“风格改变”事件?

    是否可以在 jQuery 中创建一个可以绑定到任何样式更改的事件侦听器 例如 如果我想在元素更改尺寸或样式属性中的任何其他更改时 执行 某些操作 我可以执行以下操作 div bind style function console log t
  • 将字符串转换为代码

    我想知道是否有任何方法可以转换String为Java可编译代码 我有一个比较表达式保存在数据库字段中 我想从数据库中检索它 然后在条件结构内对其进行评估 有什么办法可以做到这一点吗 如果您使用 Java 6 您可以尝试 Java 编译器 A
  • PHP MySQL 小查询超时,必须将限制设置为 10

    在为相对较小的查询调用 mysql query 时 我收到 PHP 超时错误 因此我必须将限制设置为 10 Fatal error Maximum execution time of 120 seconds exceeded in C xa
  • 角度路由when()无需映射到控制器或模板

    可以使用when 而不映射到任何控制器或模板吗 这就是我配置路线的方式 app config function routeProvider locationProvider locationProvider html5Mode true r
  • 如何在签署 pdf 文件时将时间戳属性添加到认证详细信息

    我想在证书中显示时间戳属性 如图所示 我应该在签名中设置什么 这是我添加标志信息的代码 private SignerInformation signTimeStamp SignerInformation signer throws IOEx
  • python“字符串”模块?

    所以我正在阅读这个旧模块 我认为是 2002 年左右 它有这一行 导入字符串 Python 是否要求您在能够使用字符串类型变量或其他东西之前显式导入字符串模块 我没有看到它在代码中这样使用 string something The stri
  • 天青错误。您没有权限查看该目录或页面

    当我导航到部署的 azure 网站时 出现错误 You do not have permission to view this directory or page 在我的 web config 中
  • 如何生成像github这样的个人访问令牌?

    这是理论问题 我想在 net core webapi 中创建类似 Github 个人访问令牌 的机制 该机制已经与 Identity Server 4 具有 ResourceOwnerPassword 流 理论上 我想根据用户请求手动生成令
  • 用分隔符分割字符串

    我目前正在尝试拆分字符串1128 2这样我就可以有两个不同的值 例如 value1 1128 和 value2 2 这样我就可以单独使用每个值 我努力了split 但没有成功 Grails 是否有特定的方法来处理这个问题 或者有更好的方法
  • 在 UML 中包含或扩展?

    据我所知 扩展关系是当用例是可选的时 但包含是当需要用例的操作时 但不是所有时候 我想为注册系统建模一个用例 但对使用哪种关系有疑问 我有两个可能的选择 我更热衷于 b 表示此操作的方式 因为修改数据和删除数据的部分不应该是可选的 它们用于
  • 如何在Windows中使用启用伪语言环境进行测试?

    Windows Vista引入了三个概念伪语言环境 http msdn microsoft com en us library dd319106 28v vs 85 29 aspx Pseudo Locale Locale Name LCI
  • PhoneGap Build 上的每个平台配置 (config.xml)

    我有一个在 PhoneGap Build 上远程构建的 PhoneGap 3 1 应用程序 在我的应用程序中有一个config xml文件位于项目的根目录下 该文件包含
  • 指向连续二维数组的指针

    我正在使用带标志的 gcc 版本 4 8 0 Wall std gnu99 我需要使用 C 中的 malloc 为连续的二维数组动态分配内存 这个事实是不容谈判的 但是 为了便于使用 我仍然希望能够使用方便的方式访问数组x r c 符号 这
  • 无法在 Select2 下拉列表中选择项目

    我正在开发一个使用 Select2 版本 3 5 1 的应用程序 设置此下拉 自动完成字段的 HTML 如下所示
  • C 中的静态函数

    在 C 中将函数设为静态有什么意义 制作一个函数static对其他翻译单元隐藏它 这有助于提供封装 https en wikipedia org wiki Encapsulation computer programming 助手文件 c
  • 如何使用 Identity Server 授权 Blazor WebAssembly SPA 应用

    我正在编写一个演示 Blazor WebAssembly SPA 技术演示应用程序 但我在身份验证方面遇到一些问题 我将使用 Identity Server 进行授权 但我找不到任何支持它的库 我发现的所有教程都指导如何使用 Blazor
  • 游戏手柄支持安卓

    我正在尝试向我的游戏添加游戏手柄支持 但我找不到任何地方如何从游戏手柄的操纵杆获取运动事件 我有类似的东西 但它似乎从未被调用或做任何事情 我正在使用 JellyBean 在 XOOM 上进行测试 我的游戏手柄可用于在菜单中导航 Overr
  • UITableViewCell 具有基于宽度的固有高度

    所以我制作了自定义视图 ExpressionView 来可视化数学表达式 表达式的每一部分都是 UILabel 保存一个数字或运算 并且标签在 ExpressionView 内以右对齐的行对齐 我希望 ExpressionView 具有由外