UIView 的自动布局大小第一次报告错误大小 class

UIView's autolayout size reported from wrong size class the first time

我有一个带有一些自定义单元格的 UITableViewController 和每个单元格中的一个 UIView。我已经实现了控制器的 cellForRowAtIndexPath 以在每个单元格中配置 UIView。为此,我需要知道屏幕上 UIView 的宽度。由于我使用自动布局和大小 classes 来根据设备方向自动更改 UIView 的大小,因此我实现了另一种获取宽度运行时的方法。

问题是,当 table 视图第一次显示时,我的代码报告 UIVIew 的宽度来自紧凑的宽度大小 class 即使我在横向使用设备时也是如此.系统按应有的方式呈现所有视图,但我获取宽度的代码不起作用。滚动可见的新单元格或更改方向将立即纠正这种情况。

我的代码:

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

            // ...

            CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];

            if (cell == nil) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
                cell = [nib firstObject];
            } else {

                // Clear custom content

                NSArray *viewsToRemove = [cell.histogramView subviews];
                for (UIView *v in viewsToRemove) {
                    [v removeFromSuperview];
                }
            }

            [cell setNeedsLayout];
            [cell layoutIfNeeded];

            int width = ((CustomView*)cell.customView).getWidth;
            NSLog(@"width = %d", width);

            // ...

}

然后:

@implementation CustomView

- (int)getWidth {
    [self setNeedsLayout];
    [self layoutIfNeeded];

    int width = self.frame.size.width;
    return width;
}

@end

编辑添加:

问题似乎是在第一次调用 cellForRowAtIndexPath 时 tableview 出现时,单元格没有发生自动布局。在创建单元格后立即使用 [cell setNeedsLayout] 和 [cell layoutIfNeeded] 强制它也不能解决问题。

看来我的问题根本原因可能与 重复所以问题与以下事实有关:当我的 CustomCell 从 nib 加载时,它将具有默认框架。应该使用特殊技巧来强制自动布局。但是,接受的答案不适用于最初不在可见区域的单元格。有人接受这个吗?

我建议尝试使用约束和比率而不是框架的实际宽度,因为正如 Marcus Adams 所述,只有在 viewDidAppear 之后框架才会具有您实际寻找的值。

例如,如果您的单元格包含一个宽度为单元格宽度 1/3 的 UILabel 和一个填充 space 左侧的 UIImageView,您可以在它们与父视图之间设置约束。

你的逻辑能改成这样吗?

另一个建议是在 viewDidAppear 之后在 table 视图上调用 reloadData,但这在用户体验方面绝对不是一个好的选择。

我找到了正确的解决方案:

  1. 像原始问题一样创建一个自定义单元格。
  2. tableview: cellForRowAtIndexPath:
  3. 中设置cell.contentMode = UIViewContentModeRedraw
  4. 像这样为自定义单元格实施 layoutSubviews

    - (void)layoutSubviews { [super layoutSubviews]; NSLog(@"cell width == %f", self.bounds.size.width); }

这样您就可以访问屏幕上显示的单元格大小。