【发布时间】:2016-06-13 06:28:20
【问题描述】:
问题定义
我正在尝试构建一个行为类似于UILabel 的自定义控件。我应该能够将这样的控件放置在自调整大小的表格单元格中,它应该:
- 包装它的内容(就像 UILabel 和 numberOfLines=0 一样)
- 自动扩展自定尺寸的单元格高度尺寸
- 处理设备旋转
- 不需要 UITableCellView 或 ViewControll 中的任何特殊代码来实现此功能(UILabel 不需要任何特殊代码)。
研究
我做的第一件事很简单。我决定观察 UILabel 是如何工作的。我做了以下操作:
- 创建了一个包含自行调整大小的单元格的表格
- 创建了一个自定义单元格,放入 UILabel(其中有
numberOfLines=0) - 创建约束以确保 UILabel 占据整个单元格
- 继承 UILabel 并覆盖一堆方法以查看其行为方式
我检查了以下内容
- 纵向运行(标签在多行上正确显示)并且单元格高度正确
- 旋转它。表格的宽度和高度已更新,它们也是正确的。
我观察到它表现良好。它不需要任何特殊代码,我看到了系统渲染它的(一些)调用的顺序。
部分解决方案
@Wingzero 在下面写了一个部分解决方案。它创建正确大小的单元格。
但是,他的解决方案有两个问题:
它使用“self.superview.bounds.size.width”。如果您的控件占据整个单元格,则可以使用此选项。但是,如果单元格中还有其他使用约束的内容,则此类代码将无法正确计算宽度。
它根本不处理旋转。我很确定它不会处理其他调整大小事件(有一堆不太常见的调整大小事件 - 例如状态栏在电话中变大等)。
你知道如何解决这个案例的这些问题吗? 我发现了一堆关于构建更多静态自定义控件和在自调整单元格中使用预构建控件的文章。
但是,我还没有找到任何可以解决这两个问题的解决方案。
【问题讨论】:
-
不使用自动布局? :)
-
@Wingzero。我想写一个像 UILabel 一样的组件。它可以放置在自调整大小的单元格中并正确包装其内容(同时扩展此单元格大小的单元格的高度)。这差不多。顺便提一句。 UILabel intristicContentSize 并不完全与框架无关。它使用preferredLayoutWidth(几乎是frame.width)来确定它应该如何布局。
-
@VictorRonin,是的,我认为你的方法是正确的,你说你在计算 intristicContentSize 时遇到了麻烦,不知道如何获得宽度?那么你的 UIView 里面是什么?,当你覆盖固有尺寸时,你应该已经知道宽度了。
-
@Wingzero。您是指 UIView 的宽度还是我的内容。如果您指的是 UIView 的宽度,那是我描述的 #2。调用intrinsicContentSize 时,框架将是错误的(IB 构建器值与实际运行时值)。如果您指的是我的内容的宽度,那么是的,我知道。但是,与文本相同,它可以表示为 900 pt 用于 1 行 ext 或 300 pt 用于 3 行文本。我需要返回多行以让 iOS 制作一个正确高度的单元格。这需要我知道 UIView / 单元格宽度。
-
@VictorRonin 没错,它涉及更多工作。但是您是否尝试过使用 CGRectDivide/CGRectInset 或它们的 Swift 等价物进行布局?这比处理边/pos(x,y) 的工作量要少得多。
标签: ios uitableview uiview