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 的弹出视图