我正在尝试在 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/