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

Posted

技术标签:

【中文标题】iOS 8 UITableViewCell 上的弹簧和支柱调整大小损坏【英文标题】:Springs and struts resizing broken on iOS 8 UITableViewCell 【发布时间】:2014-10-15 23:21:32 【问题描述】:

我正在尝试在界面生成器中设置一个简单的UITableViewCell 没有自动布局。我正在使用旧的弹簧和支柱。

当我给标签一个灵活的宽度时,它的布局似乎好像UITableViewCell 的宽度要大得多,尽管UITableViewCell 告诉我它在layoutSubviews 中的宽度是375 像素:

- (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

在模拟的 iPhone 5S(ios 7 或 8)上,superview 为 320,但 UILabel 扩展到 640。

在模拟的 iPhone 6 上,superview 为 375,但 UILabel 扩展到 695。

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

我对其他视图没有这个问题。例如,我可以将UILabel 添加到UIViewController 并让它正确拉伸宽度。到底是怎么回事?我该如何解决这个问题?

编辑:

有趣的是,如果我在cellForRowAtIndexPath: 期间以编程方式添加约束,那么只要我使用旧的dequeueReusableCellWithIdentifier 而不是dequeueReusableCellWithIdentifier:forIndexPath:,它似乎就可以按预期工作。不过,我想将所有约束保留在 Interface Builder 中。有什么想法吗?

【问题讨论】:

这可能与此有关:***.com/a/25884832/3899770 【参考方案1】:

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

我可以解决这个问题的唯一方法(尽管感觉很糟糕,您可能应该坚持使用自动布局),是设置标签的框架相对于 awakeFromNib 中的内容视图。

- (void)awakeFromNib

    [super awakeFromNib];
    self.label.frame = self.bounds;

【讨论】:

宾果游戏!谢谢约翰 :) 我会坚持使用单元格的自动布局。值得庆幸的是,它们都在自己的 nib 中,因此不会影响项目的其余部分。

以上是关于iOS 8 UITableViewCell 上的弹簧和支柱调整大小损坏的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的弹出框在 iPhone 6 Plus 上的 iOS 8.1 中崩溃? iOS 8 工作(实际上是 Xcode 6.0 到 6.1 的错误)

添加到 UITableViewCell 的 contentView 的 UITextField 在 Popover 中无法正确显示(iPad、iOS 4.2)

UITableViewCell 上的 UIPopoverController

XCode5 中 UITableviewCell 的弹出视图

iOS UITableViewCell的"滑动出现多个按钮"

iOS:通过自定义 UITableViewCell 上的 UITextView 进行选择