如何创建一行 UILabel 的“容器”视图?

Posted

技术标签:

【中文标题】如何创建一行 UILabel 的“容器”视图?【英文标题】:how to create a "container" view of a row of UILabels? 【发布时间】:2011-03-23 02:49:31 【问题描述】:

我能否要求一些关于如何为一行 3 个 UILabel 创建“容器”类型视图以在自定义子类 UITableViewCell 中使用的高级指导?您将如何做到这一点,例如,您将为此划分哪些类?为此我需要覆盖多少种方法? (例如 layoutSubviews,其他?)

背景:

我已经有一个自定义的子类 UITableViewCell,我可以在其中显示多行 UILabel,每行有 3 个 UILabel。 为了使代码看起来更简洁,可以将“3 x UILabel 的行”视为一个视图 我将如何做到这一点 - 我是否会为此设置“UIView”的子类?然后我会在其中覆盖“layoutSubviews”,以便让新的“3 x UILabel 行”自行布置。

【问题讨论】:

【参考方案1】:

使用哪种方法:

我想选择你的第二个选项而不是其他选项, 因为如果你从 UITableViewCell 中分离出 3 个UILabel 继承的自定义单元格类并将它们放入 UIView 继承的类中。

1.代码看起来更干净(尤其是您的自定义单元类)。正如您所指出的那样。

2.此外,如果您需要 3 个以上的 UILabel 或任何 UIView 继承的视图,您的自定义单元格类中不需要更改,

我该怎么做

创建一个UIView 继承类,将所有UILabels 添加为子视图,然后将实现提供给-(void) layoutSubviews,为每个UILabel 设置框架。

在您的自定义单元格中添加子类 UIView 作为子视图,并在 -(void) layoutSubviews 方法中为其设置框架,

【讨论】:

感谢 Jhaliya - 你正在证实我的猜测,这是一种很好的方法 YES :你的方法中最好的部分,你最终会得到一个可重用的组件(包含 3 个标签的 UIView 子类也可以在其他地方使用)【参考方案2】:

您可以继承 UIView 或将所有内容放在视图控制器中。我会选择第二个选项,因为您不需要自定义视图来做复杂的事情,为此目的,子类似乎有点“太多”。

在视图控制器中创建一些实例变量(在.h中):

UILabel     *label1, *label2, *label3;

然后在您的实现中(在 .m 中),执行以下操作: 'viewDidLoad' 方法:

// First label... Create and configure.
label1  = [[UILabel alloc] init];
// [Configure here]
[[self view] label1];
// Second label... Create and configure.
label2  = [[UILabel alloc] init];
// [Configure here]
[[self view] label2];
// Third label... Create and configure.
label3  = [[UILabel alloc] init];
// [Configure here]
[[self view] label3];

然后在'viewDidLoad'方法中:

// Release / Nillify everything.
[label1 release], label1 = nil;
[label2 release], label2 = nil;
[label3 release], label3 = nil;

在您的“viewDidAppear”和任何其他指示方向更改的方法中,您必须配置您的布局...使用父视图 rect 获取边界/框架,并根据您需要的布局更改 3 个标签几何图形.

如果您更喜欢通过继承 UIView 来实现,您可以完全一样,但不是在 viewDidLoad 中进行布局,而是必须按照您的计划在 'layoutSubviews' 中进行。此外,如果您的视图来自 XIB,则初始化/分配代码可能会转到“initWithCoder:”,并在您的 dealloc 中解除分配。

希望对您有所帮助, 皮埃尔。

【讨论】:

感谢 Pierre - 您的第二个选项是建议我可以有两个视图控制器,并让一个控制器引用另一个控制器来构建每一行 UILabel?我已经在单个子类 UITableViewCell 中实现了一切正常,所以我正在寻找一种方法来打破 UILabel 行的编码... 不,第二个选项更多的是关于真正的 UIView 子类化(例如,让自定义 UIView 完成所有工作,而不是将工作委托给您的控制器)。在 UITableViewCell 中这样做是可以的,我想我不明白你的问题......你能发布一些代码吗?

以上是关于如何创建一行 UILabel 的“容器”视图?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何将 UIImage 和 UILabel 作为页脚放在同一行?

在堆栈视图中创建UILabel互相拥抱

SwiftUI 二

容器视图和滚动视图呈现偏移的表示

iOS 如何通过 PureLayout 使两个视图居中

具有比例宽度和文本驱动高度的动态 UILabel