我尝试使用通常的方法删除标签,并使用autolayout调整所有内容。 How to change label constraints during runtime。但是,我在UITableView 标题中执行此操作。
当我设置其中一个标签的高度限制时:
self.labelAHeight.constant = 0;
结果是:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1)
look at each constraint and try to figure out which you don't expect; (2) find the code that added
the unwanted constraint or constraints and fix it. (Note: If you're seeing
NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the
UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0xb0faad0 V:[UILabel:0xb0fa830(0)]>",
"<NSLayoutConstraint:0xb0772a0 V:[UILabel:0xb077300(58)]>",
"<NSLayoutConstraint:0xb076cc0 V:|-(0)-[UILabel:0xb0fa830] (Names: '|':UIView:0xb077660 )>",
"<NSLayoutConstraint:0xb076c90 V:[UILabel:0xb077300]-(0)-| (Names: '|':UIView:0xb077660 )>",
"<NSLayoutConstraint:0xb076c00 V:[UILabel:0xb0fa830]-(0)-[UILabel:0xb077300]>",
"<NSAutoresizingMaskLayoutConstraint:0xb06f030 h=--& v=--& V:[UIView:0xb077660(119)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xb0772a0 V:[UILabel:0xb077300(58)]>
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h>
may also be helpful.
我已经尝试了[self.labelA setTranslatesAutoresizingMaskIntoConstraints:NO]
但没有帮助。
我已尝试[self.table.tableHeaderView setTranslatesAutoresizingMaskIntoConstraints:NO]
与*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
崩溃。可能,我在错误的地方做这件事(就在设置约束常数之前)。
约束变化发生的地方似乎并不重要,例如viewDidLoad
或按钮处理程序。
好像标题想要成为某个高度(<NSAutoresizingMaskLayoutConstraint:0xb06f030 h=--& v=--& V:[UIView:0xb077660(119)]>
基于其内容),如果内容发生变化,autolayout会非常不满意。
任何人都可以帮助调试或建议如何解决它吗? (我已经尝试了仪器,但是被添加和删除的所有限制感到困惑......)
答案 0 :(得分:0)
以下是部分答案。可以防止上面的约束问题,但是,我还没有找到如何在标题大小改变时使表的其余部分移动。
1)在故事板中设置表头的translatesAutoresizingMaskIntoConstraints = NO。
2)由于自动调整掩码没有提供约束,因此在标题上设置约束。
- (void)viewDidLoad {
[super viewDidLoad];
[self.table addConstraint:
[NSLayoutConstraint constraintWithItem:self.table.tableHeaderView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.table
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0]];
[self.table addConstraint:
[NSLayoutConstraint constraintWithItem:self.table.tableHeaderView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.table
attribute:NSLayoutAttributeTop
multiplier:1
constant:0]];
}
将标签A的高度约束常量设置为零的结果是:
之前:
之后(可以看出顶部标签已经消失,但表格行没有向上移动到标题的底部):
我已经确认标题视图实际上已经降低了它的高度。
我在标题,表格和视图上尝试了setNeedsLayout
和setNeedsDisplay
。我尝试beginUpdates
和endUpdates
围绕设置约束不变。我试过了reloadData
。但没有任何效果。
我怀疑该表在标题和单元格之间没有约束。
如果有人有任何想法,我会很高兴听到他们。
修改强>
3)可以使用以下内容重绘表格:
self.labelAHeight.constant = 0;
[self performSelector:@selector(reloadHeader) withObject:nil afterDelay:0];
// [self.table.tableHeaderView setNeedsUpdateConstraints];
//
// [UIView animateWithDuration:0.3f animations:^{
// [self.table.tableHeaderView layoutIfNeeded];
// }];
和
- (void) reloadHeader {
// [self.table beginUpdates];
self.table.tableHeaderView = self.table.tableHeaderView;
// [self.table endUpdates];
}
取消注释上面的行会尝试为更改设置动画,但是标题的动画和表格的其余部分并没有严格地绑定在一起,因此标题和表格之间可能会出现间隙。
仍然不完美,但越来越近了。