我有一个自定义tableViewCell:
Extra text
标签有时会被隐藏,因此单元格应该自动调整大小。
隐藏此Extra text
标签,设置.active = NO;对于标签周围的规则:
-(void)setShowExtraText:(BOOL)showExtraText
{
_showExtraText = showExtraText;
if (showExtraText) {
self.textfieldBottomSuperviewConstraint.active = NO;
self.extraText.hidden = NO;
self.textfieldExtraTextConstraint.active = YES;
self.leadingExtraTextConstraint.active = YES;
self.extraTextBottomContraint.active = YES;
}
else{
self.extraText.hidden = YES;
self.textfieldExtraTextConstraint.active = NO;
self.leadingExtraTextConstraint.active = NO;
self.textfieldBottomSuperviewConstraint.active = YES;
self.extraTextBottomContraint.active = NO;
}
}
只有一个单元格中没有隐藏Extra text
标签,这是tableView中的最后一个单元格。
问题是当tableView加载单元格的高度是错误的。另外看一下它显示的Debug View Hierarchy
忽略了停用规则的代码。因为停用的规则仍在视图中。
如果我向下滚动并向上滚动,单元格的布局是正确的,显示带有Extra文本的那个和没有正确文本的那个。
我尝试添加:
[self setNeedsLayout];
[self layoutIfNeeded];
我尝试使用SizeClasses。 (我之前没有使用sizeClasses)
我没有想法,任何想法?
由于
更新1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithExtraText" forIndexPath:indexPath];
[cell setShowExtraText:(indexPath.section == LOGIN_SECTION && indexPath.row == REPEAT_PASSWORD_ROW)];
return cell;
}
更新2
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithExtraText" forIndexPath:indexPath];
[cell setShowExtraText:(indexPath.section == LOGIN_SECTION && indexPath.row == REPEAT_PASSWORD_ROW)];
[cell updateConstraintsIfNeeded];
[self.tableView beginUpdates];
[self.tableView endUpdates];
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
return cell;
}
答案 0 :(得分:1)
目前:
的cellForRowAtIndexPath
在返回牢房之前,请致电
updateConstraintsIfNeeded
在您的示例中,您根本不显示 CellForRowAtIndexPath 方法。 在调用 updateConstraintsIfNeeded
之前,请务必调用 setShowExtraText在表格视图中调用:
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
之后
ReloadData
之后,每次你想要更新你的单元格高度而不重新加载所有tableView,只需要单元格
[self.tableView beginUpdates];
[self.tableView endUpdates];
答案 1 :(得分:0)
我认为激活和停用自动布局规则时会出现问题。
如果您在规则或/和视图中更改特征,则可以正常工作。
例如,这是完美运作的解决方案:
-(void)setShowExtraText:(BOOL)showExtraText
{
_showExtraText = showExtraText;
if (showExtraText) {
[self.extraText setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisVertical];
[self.extraText setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisHorizontal];
}
else{
[self.extraText setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisVertical];
[self.extraText setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisHorizontal];
}
}
我不必使用
在表格中进行任何更新 [self.tableView beginUpdates];
[self.tableView endUpdates];
,也不
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
正常工作。
显然这是一个解决方法,因为我不想在层次结构中使用标签Extra text
。使用此解决方案,标签仍然存在,但高度和宽度为0.
我希望它有助于某人。
感谢@MCMatan的想法,让我得到解决方案:)