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 具有基于宽度的固有高度 的相关文章

  • 去除iOS输入阴影

    在 iOS Safari 5 上 我必须遵循输入元素 顶部内部阴影 我想删除顶部阴影 错误 webkit appearance不保存 目前的风格是 input border radius 15px border 1px dashed BBB
  • 使用 Swift 解析框架

    有人尝试过将 Parse Framework 与 swift 一起使用吗 只要添加桥接文件 您就可以使用 swift 和 Objective C 代码 这是我的查询 从 Parse 返回的 对象 数组正确地包含了我的所有数据 但该方法在将
  • CBPeripheralManager 连接回调

    我正在尝试在两个 iOS 设备之间建立蓝牙连接 这个想法是 一个设备提供一项服务 多个设备连接到该服务 设备 A 服务 用户滑动浏览演示文稿 设备 B 多个客户端 用户观看演示 无交互 根据我的理解 提供服务的人应该通过创建 CBPerip
  • Swift 为 .toInt 提供Optional(3) 而不是 3

    尝试从字段中提取数字并继续获取可选 数字 而不是数字 IBOutlet weak var years UITextField IBAction func calculateYear sender AnyObject var a years
  • MKPolylineView initWithPolyLine:在 iOS 7 中已弃用

    我收到以下错误 initWithPolyline 已弃用 首先在 iOS 7 0 中弃用 MKPolylineView lineView MKPolylineView alloc initWithPolyline overlay 代替这个的
  • 如果两个数组包含相同的元素,无论这些元素出现的顺序如何,如何在 Swift 中检查?

    假设有两个数组 var array1 a b c var array2 b c a 我希望这两个数组的比较结果为真 以下 var array1 a b c var array2 b c a d 是假的 我怎样才能在 Swift 中实现这一点
  • NSAttributedString 和表情符号:位置和长度问题

    我正在使用 NSAttributedString 对来自 API 的文本的某些部分 如 Twitter 上的 mention 进行着色 API 为我提供了文本和代表文本中应着色的部分 或链接 标签等 的实体数组 但有时 颜色会因为表情符号而
  • 如何在iOS应用程序中实现互斥锁[重复]

    这个问题在这里已经有答案了 可能的重复 GCD 如何从两个线程写入和读取变量 https stackoverflow com questions 11070947 gcd how to write and read to variable
  • 如何使用 Unicode 十六进制值 (UTF-16) 在 Swift 中表达字符串

    我想在 Swift 中使用十六进制值编写 Unicode 字符串 我已阅读文档 https developer apple com library prerelease ios documentation Swift Conceptual
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 为什么我的matchedGeometryEffect根据右下点移动?

    我只是尝试使用matchedGeometryEffect 制作一些动画 但是 存在一个错误 即该对象是根据右下点而不是中心进行动画处理的 我使用的代码在这里 import SwiftUI struct Test View Namespace
  • 当应用程序名称在 InfoPlist.strings 中本地化时,不同的应用程序名称取决于配置

    我们为每个配置使用具有不同 plist 的设置 像这样 目标 Info Dev plist 目标 Info Beta plist 这样我们的配置就可以拥有自己的 CFBundleDisplayName 并且我们可以通过设备上的应用程序名称来
  • 将深层链接传递到 iOS 模拟器?

    我想找到一种更简单的方法来在 iOS 模拟器中调用深层链接 在 Android 上 您可以使用 ADB 通过控制台将链接传输到模拟器中 是否有类似的方法或解决方法来打开最新 iOS 模拟器的深层链接 您可以在终端中输入以下内容 xcrun
  • 在 Objective-C iPad 开发中发布

    我正在尝试发出 POST 请求 但我似乎无法弄清楚出了什么问题 我从服务器收到响应 但我的电子邮件 密码对似乎没有正确发送 读取 由服务器 它告诉我不存在这样的帐户 这是我的代码 它包含在一个函数中 当用户按下我创建的 登录 按钮时调用该函
  • 当前位置在 Google 地图中不起作用

    我在 swift 3 中集成了谷歌地图 当地图屏幕出现而不显示当前位置时 我在 plist 文件中添加了两个键 并设置了 CLLocationManager delegate 和 requestAlwaysAuthorization cla
  • Swift 3 的 NSLog 问题

    迁移到 Swift 3 后 当我尝试执行以下操作时出现错误 self publicDB save listRecord completionHandler record error gt Void in if let saveError e
  • 如何解决创建 SwiftData #Predicate 的编译器错误?

    我一直在尝试很多方法来解决这个问题 我正在尝试使用谓词获取 SwiftData 记录 但我尝试的一切都会导致两个错误 初始化程序 init 要求 Item 符合 Encodable 初始化程序 init 要求 Item 符合 Decodab
  • NSFetchedResultsController 中的部分名称与托管对象值不匹配

    我正在使用 NSFetchedResultsController 用大约 1500 个实体的中等大小的核心数据存储的结果填充 UITableView 结果控制器相当标准 一些潜在错误的 热点 并不适合此设置 在与其使用的同一 主 线程上创建
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE

随机推荐

  • 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 具有由外