如何设置我的 UITableViewCell 子类的子视图以使用自动调整大小的蒙版?

Posted

技术标签:

【中文标题】如何设置我的 UITableViewCell 子类的子视图以使用自动调整大小的蒙版?【英文标题】:How do I setup the subviews of my UITableViewCell subclass to use autoresizing masks? 【发布时间】:2011-12-16 17:42:07 【问题描述】:

我正在尝试为我的 ios 应用程序实现一个网格(想想 .NET 的 DataGridView)。我正在使用带有自定义 UITableViewCell 子类的 UITableView,其中我有几个标签代表该行的每一列数据。我的问题与在设备方向更改后调整这些标签的宽度有关。我基本上想按比例调整它们的大小,例如,纵向占据网格宽度 1/3 的列在切换到横向时仍将占据宽度的 1/3。

现在我通过覆盖我的 UITableViewCell 子类的- (void)layoutSubviews 方法来实现这一点;我基本上只是硬编码 iPad 和 iPhone 横向与纵向的比例。但是,这仅在网格本身根据方向变化按比例调整大小时才有效,当然情况并非总是如此。

为了实现一个在任何情况下都有效的解决方案,我考虑在 layoutSubviews 方法中使用self.bounds.size.width,但似乎自动调整掩码是更好的解决方案。如果我将每个 UILabel 的掩码设置为UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleLeftMargin | UIViewAutoResizingFlexibleRightMargin,那么我应该实现我正在寻找的缩放类型。但是,我想不通的是如何设置每个标签的初始帧。如果在调用 layoutSubviews 之前我不知道单元格的起始边界,我该如何安排我的子视图开始?

【问题讨论】:

【参考方案1】:

尝试使用self.contentView.bounds.size 作为计算的基础。例如:

int numberOfLabels = 3;
CGFloat marginHorizontal = 10;
CGFloat spacingHorizontal = 8;
CGFloat totalWidth = cell.contentView.bounds.size.width;
// That's how much is available to all labels 
CGFloat availableWidth = (totalWidth
                          - 2 * marginHorizontal
                          - (numberOfLabels - 1) * spacingHorizontal);
// That's how much each label gets - initially!
CGFloat labelWidth = availableWidth / numberOfLabels;

不要担心内容视图最初只有 320 的宽度。稍后会调整它的大小,你的标签也会随之调整。

顺便说一句:您可能应该为左右边缘的标签指定不同的掩码:

左边缘:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin 右边缘:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin

【讨论】:

以上是关于如何设置我的 UITableViewCell 子类的子视图以使用自动调整大小的蒙版?的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 在我的 UITableViewCell 子类中覆盖触摸事件

如何排列不同的 UITableViewCell 图像和标签?

为子类 UITableViewCell 上的披露按钮设置目标

子类 UITableViewCell - backgroundView 涵盖了我在 drawRect 中所做的任何事情

UITableViewCell - 设置单元格的最佳位置

dequeueReusableCellWithIdentifier: 在我的 UITableViewCell 子类中调用初始化程序吗?