我很难在iOS 7和8下实现动态大小单元格的表视图布局。我无法详细说明所有差异(即“损坏布局的方式”),因为这些差异可以使用不同的“调整”、“解决方法”和其他我在此处和其他地方找到的东西来产生。但最终,无论是在iOS 7还是iOS 8上(如果不是两者都有),某些或所有单元格内容都会对齐不良,因为布局系统“破坏”了一个自定义约束以“恢复”。
基本上,我有三种不同类型的内容。由于我不仅在上述表视图中显示这些内容,因此我将内容包装在三个
在
这篇文章有点绝望。我知道如果没有具体视图类的约束条件,你无法重新检查它们。但是,由于我可以在没有问题的情况下使用这些视图,因此不应该是子视图约束问题。
我想我将不得不手动计算所有视图元素的大小(基于
此致 敬礼, Gabriel
基本上,我有三种不同类型的内容。由于我不仅在上述表视图中显示这些内容,因此我将内容包装在三个
UIView
子类的中。让我们称它们为SummaryView
。
对于表视图,我创建了三个UITableViewCell
的子类,每个子类都向其contentView
添加相应的SummaryView
并设置self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
。在updateViewConstraints
上,我通常会删除之前可能添加的所有“我的”约束,然后执行...- (void)updateConstraints
{
// ...removed custom constraints before
NSDictionary *views = NSDictionaryOfVariableBindings(_summaryView);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];
[super updateConstraints];
}
在
tableView:estimatedHeightForRowAtIndexPath:
方法中,我会根据内容类型返回一个静态的预估高度。在tableView:heightForRowAtIndexPath:
方法中,我使用“原型”单元格的方式来...// ..set content on prototype cell before
[prototypeCell setNeedsUpdateConstraints];
[prototypeCell layoutIfNeeded];
CGSize size = [prototypeCell systemLayoutSizeFittingSize:UILayoutFittingExpandedSize];
return size.height;
通常情况下,调试器会在UIViewAlertForUnsatisfiableConstraints
(即[prototypeCell layoutIfNeeded]
)处中断,因为<NSLayoutConstraint:0x17409f180 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17019f070(44)]>
与其他约束冲突。
所以我尝试了...
- Setting
tableView.rowHeight = UITableViewAutomaticDimension
in table view'sviewDidLoad
- Not implementing
tableView:estimatedHeightForRowAtIndexPath:
Using...
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) { cell.contentView.frame = cell.bounds; cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin; }
...before applying cell's content and calculating its layout
- Doing
self.contentView.bounds = CGRectMake(0.0, 0.0, 1000, 1000);
upon cell initialization - Probably other things which, right now, I can't remember as I'm on this for more or less two days now.
<NSLayoutConstraint:0x17409f180 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17019f070(44)]>
约束,但是基于tableView:heightForRowAtIndexPath:
返回的高度而设置的约束集也不能适应布局系统。这篇文章有点绝望。我知道如果没有具体视图类的约束条件,你无法重新检查它们。但是,由于我可以在没有问题的情况下使用这些视图,因此不应该是子视图约束问题。
我想我将不得不手动计算所有视图元素的大小(基于
[UIScreen mainScreen].bounds
),并将它们直接设置为所有子视图的宽度和高度。这样,我就能够获得单元格的具体高度,并手动设置contentView
的框架。这相当可惜,因为它会显着破坏布局代码。此致 敬礼, Gabriel
–tableView:heightForRowAtIndexPath:
方法返回的值。这将定义屏幕上的实际高度。玩弄自动布局或自动调整大小掩码是无济于事的。 - holextableView:heightForRowAtIndexPath
的用途。 C:我不是在玩弄自动布局,我实际上正在使用它。 D:与autoresizingMask
玩耍似乎已经帮助了其他人:https://dev59.com/LGIk5IYBdhLWcg3wl_Ip#19154287。 - dergab