iOS:如何在其附件视图更改时触发 tableViewCell 的约束/自动布局刷新?
Posted
技术标签:
【中文标题】iOS:如何在其附件视图更改时触发 tableViewCell 的约束/自动布局刷新?【英文标题】:iOS: How to trigger a refresh of constraints/autolayout of a tableViewCell when its accessoryView changes? 【发布时间】:2015-04-30 13:32:02 【问题描述】:我有一个自定义表格视图 + 自定义单元格,这些单元格是使用基于约束的自动布局构建的(全部以编程方式,没有 IB)。在每个单元格中(除其他外)都有一个(可能)带有文本的多行标签。自动布局的第一次计算很好 - 即 UILabel 根据其文本长度正确换行。
但是,一旦我选择了一个单元格(即从 UITableViewCellAccessoryNone 更改为 UITableViewCellAccessoryCheckmark),我就会遇到布局问题,并且 UILabel.text 所需的行数应该会更改 - 但会保持不变。
我试过了……
[myTableView reloadData];
和
[myTableView beginUpdate];
[myTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[myTableView endUpdates];
...在单元格选择的委托中,但没有成功更新单元格的布局。
我想我需要告诉系统重新评估 tableviewcell 的约束(特别是重新评估 UILabel 的 preferredMaxLayoutWidth。)但我不知道如何以正确的方式做到这一点。 (我用 setNeedsUpdate 尝试了一些东西,而是尝试和错误的风格。)
提前感谢您为我指明正确的方向!
【问题讨论】:
对于多行标签,您必须在约束更新时提供首选最大布局宽度 - (void)updatePreferredMaxLayoutWidth:(UILabel *)label label.preferredMaxLayoutWidth = [label alignmentRectForFrame:label.frame].size.width ; 【参考方案1】:您必须通过以下方式专门重新评估 UILabel 的 preferredMaxLayoutWidth:-
- (void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
[self updatePreferredMaxLayoutWidth:self.lblText]; // you have to store a UIlabel temporarily on didselectaction of UITableView
[self.view layoutSubviews];
【讨论】:
感谢您在这里帮助我!只是为了确保 - 我是否需要为此子类化 UILabel 或者上面的代码是否属于其他地方(viewcontroller、tableview、cell)? (顺便说一句。在调用 [self.contentView layoutIfNeeded] 和 [super updateConstraints] 之前,我当前在我的自定义单元格的 updateConstraints 方法中设置了 myLabel.preferredMaxLayoutWidth ...) 是的,伙计,您可以在 [self.view layoutSubviews] 和 [super viewDidLayoutSubviews] 之间设置 myLabel.preferredMaxLayoutWidth ,如果您使用自定义,则必须在自定义 UITableViewCell 类中提供方法 (void)viewDidLayoutSubviews类,否则对于原型 Cell,您可以将其放在 ViewController 类中,但您必须从 tableview 中获取 Selected Cell 的 UILabel。以上是关于iOS:如何在其附件视图更改时触发 tableViewCell 的约束/自动布局刷新?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 防止 UIAppearance 设置更改 UIWebView 输入附件视图