【问题标题】:Custom cell's UIView frame not updating in cellForRowAtIndexPath自定义单元格的 UIView 框架未在 cellForRowAtIndexPath 中更新
【发布时间】:2014-05-21 02:50:37
【问题描述】:

我有一个带有 UIView 的自定义单元格,我正在尝试更新 cellForRowAtIndexPath 中的框架。对于在第一轮行中加载的行,帧都已成功更新。但是,需要滚动才能看到的行不会更新其视图框架,直到将它们滚动到视图中,将它们滚动到视图之外,然后再将它们滚动回视图。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    RoundCell *cell = (RoundCell *)[tableView dequeueReusableCellWithIdentifier:@"RoundCell"];

    CGRect frame = CGRectMake(160, 10, 50, 22);
    cell.rightConfidenceBar.frame = frame;
}

对于最初未加载的行,为什么我需要在更新其 UIView 框架之前将它们滚动到视图中,然后滚动到视图中?

【问题讨论】:

  • 为什么不在自定义单元格的实现中设置rightConfidenceBar 的框架?那就是它所属的地方。
  • 真正的实现比较复杂,这个栏的边框(特别是宽度)需要在运行时根据从服务器接收到的数据动态设置。
  • 这不会改变任何事情。将数据交给单元格,让单元格自行布局。
  • 我不确定你的意思。我的自定义单元格只有一个头文件,其属性连接到情节提要。

标签: ios objective-c uitableview


【解决方案1】:

在进行更多挖掘并找到这些问题之后:

question 1question 2question 3

我意识到这是自动布局的问题。这个问题的两个解决方案是:

1.通过取消选中其中一个答案中提到的框来关闭自动布局(不推荐)

2.按照问题1所说的做,而不是更新视图的框架,而是像这样更新宽度约束常量

for (NSLayoutConstraint *constraint in cell.rightConfidenceBar.constraints)
    {
        if (constraint.firstAttribute == NSLayoutAttributeWidth)
            constraint.constant = 50;
    }

请注意:如果您取消选中自动布局,您可能会丢失您在整个项目中所做的所有约束。

【讨论】:

  • 关于 1,您可以仅取消选中该特定自定义单元格的自动布局(选择该单元格并在文件检查器中搜索它),因此没有太多戏剧性。我做到了,一切都很好。
【解决方案2】:

之后

RoundCell *cell = (RoundCell *)[tableView dequeueReusableCellWithIdentifier:@"RoundCell"];

尝试添加

if (cell == nil)
    cell = [[RoundCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RoundCell"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多