iOS 8 UITableViewCell上的弹簧和支柱调整大小

Chr*_*let 5 iphone objective-c uitableview ios

我正在尝试UITableViewCell没有自动布局的Interface Builder中设置一个简单的.我正在使用古老的弹簧和支柱.

当我给一个标签一个灵活的宽度时,似乎布局好像UITableViewCell有一个更大的宽度,即使UITableViewCell它告诉我它的宽度为375像素layoutSubviews:

- (void)layoutSubviews
{
    [super layoutSubviews];

    NSLog(@"Label width: %f", self.nameLabel.frame.size.width); // 695.0 for a label that stretches the whole width
    NSLog(@"Superview (UITableViewCell) width: %f", self.nameLabel.superview.frame.size.width); // 375.0
}
Run Code Online (Sandbox Code Playgroud)

在模拟的iPhone 5S(iOS 7或8)上,superview是320但UILabel扩展到640.

在模拟的iPhone 6上,超级视图是375,但UILabel扩展到695.

在模拟的iPhone 6 Plus上,superview是414,但UILabel是734.

我对其他观点没有这个问题.例如,我可以添加UILabel一个UIViewController并使其正确拉伸宽度.到底是怎么回事?我该如何解决这个问题?

编辑:

有趣的是,如果我在编程期间添加约束,cellForRowAtIndexPath:它似乎按预期工作,只要我使用旧的dequeueReusableCellWithIdentifier而不是dequeueReusableCellWithIdentifier:forIndexPath:.我想在Interface Builder中保留所有约束.有任何想法吗?

小智 1

我今天玩了一下这个。看起来相对于内容视图的框架实例化标签时的标签框架是错误的。如果我使标签与故事板中的单元格大小相同,则awakeFromNibcontentView 中的大小为 ,CGRectZero但标签的大小为我在故事板中设置的大小。因此,当您将layoutSubviewscontentView 调整为正确的大小 (0,0,320,44) 时,由于灵活的宽度掩码,标签本身会随内容视图一起调整大小(宽度也增加 320)。这就是为什么它看起来比预期的要大的原因。

我可以解决这个问题的唯一方法(尽管,这感觉像是一个粗俗的黑客,你可能应该坚持自动布局),是相对于awakeFromNib.

- (void)awakeFromNib
{
    [super awakeFromNib];
    self.label.frame = self.bounds;
}
Run Code Online (Sandbox Code Playgroud)