iOS 8:UITableViewCell.contentView 不会调整其中的子视图大小
Posted
技术标签:
【中文标题】iOS 8:UITableViewCell.contentView 不会调整其中的子视图大小【英文标题】:iOS 8: UITableViewCell.contentView doesn't resize subviews in it 【发布时间】:2014-12-04 12:38:42 【问题描述】:我在UITableViewCell.contentView
中放了一个CustomView
,将自定义视图的autoresize mask
设置为W+H
。
但是在运行时,CustomView
的高度比ContentView
高,ContentView
的高度为60pt
(与UITableViewDelegate
中的设置相同),但内部的CustomView
contentView
的高度是 76pt
。
Xcode6's view debugging
,我在自定义视图上看到了一些奇怪的约束,它们是:
self.height = superview.height + 16
self.midY = superview.midY + 8
这些约束来自哪里以及如何修改它们?我从来没有设置过 8 或 16 的值。
更新:
我制作了一个测试项目,它只是情节提要中的一个表格视图,带有从 nib 文件加载的CustomView
,并且该测试项目在运行时复制了问题,CustomView
是 @ 的子视图987654338@ 的高度变得比TableViewCell.contentView
大。
测试项目在这里: https://drive.google.com/file/d/0B5y_NrRbhGlSb1dlbVZNb19vNjQ/view?usp=sharing
【问题讨论】:
您是否在故事板中禁用了 IB 的自动布局。 @AshishP。谁的自动布局?表格视图还是自定义视图? 它属于你的整个故事板。尝试取消选中它然后检查。 @AshishP。 CustomView 不在 table view 的 storyboard 中,它在一个 xib 文件中,它是动态加载的。 好的。因此,您正在情节提要中使用自动布局,并且正在从 xib 文件加载自定义视图。然后尝试以编程方式在您的自定义视图上添加相对于父视图的约束。这可能有助于将自定义视图高度保持在 contentview 边界内。 【参考方案1】:最后我明白了,自动布局只能在同一个xib或storyboard中形成关系,我的CustomView是在一个单独的xib中并在运行时加载的,所以超级视图和CustomView之间没有任何自动布局约束.
如果我将translatesAutoresizingMaskIntoConstraints
设置为 YES,那么问题就出现了,我仍然不知道为什么使用 W+H 作为自动调整大小蒙版会使 CustomView 比它的超级视图(cell.contentView)高,但我发现了一个方法:
我在superview和CustomView之间手动添加约束,然后关闭customView. translatesAutoresizingMaskIntoConstraints
,代码如下:
customView.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:customView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeTop multiplier:1 constant:0];
NSLayoutConstraint *bottom = [NSLayoutConstraint constraintWithItem:customView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:customView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:customView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeRight multiplier:1 constant:0];
[cell.contentView addConstraints:@[top, bottom, left, right]];
【讨论】:
以上是关于iOS 8:UITableViewCell.contentView 不会调整其中的子视图大小的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 和 iOS 8 中的警报视图与 UIAlertController
在 ios 8 中以横向模式隐藏并在 xCode 6 中发布 ios 8 后尝试在 ios 7 中正常工作的状态栏问题
如何在 iOS 8 中从 iOS 9 实现 UIUserNotificationActionBehavior.TextInput?