ios - iOS 8 UITableViewCell 上的 Springs 和 struts 调整大小损坏

标签 ios objective-c iphone uitableview

我正在尝试在 Interface Builder 中设置一个简单的UITableViewCell没有自动布局。我正在使用旧的 Spring 和支柱。

当我给标签一个灵活的宽度时,它看起来好像 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 上, super View 为 414,但 UILabel 变为 734。

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

编辑:

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

最佳答案

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

我能解决这个问题的唯一方法(虽然,这感觉像是一个粗俗的 hack,你应该坚持自动布局),是在 awakeFromNib 中相对于内容 View 设置标签的框架>.

- (void)awakeFromNib
{
    [super awakeFromNib];
    self.label.frame = self.bounds;
}

关于ios - iOS 8 UITableViewCell 上的 Springs 和 struts 调整大小损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26393735/

相关文章:

ios - AFNetworking 3.0 没有从响应中获取 json

objective-c - 返回数组中* Fraction对象之和的函数不起作用

iphone - 发送带有数据的短信

iphone - Sprite-Kit 教程和示例游戏项目

iphone - 数据库未更新

iphone - 在启用分页和多个图像的情况下缩放 UIScrollView

ios - 如何获得麦克风和摄像头设备?

iphone - 钛加速器 : Create system/icon buttons without placing on toolbar

ios - tableView.moveRow 的自定义动画(位于 : to:)

ios - 如何从 Firebase 发送 OTP(一次性密码)