Ios 在“cellForRowAt”中激活NSLayoutConstraint直到滚动后才会呈现
我需要支持Ios 在“cellForRowAt”中激活NSLayoutConstraint直到滚动后才会呈现,ios,swift,uitableview,uikit,nslayoutconstraint,Ios,Swift,Uitableview,Uikit,Nslayoutconstraint,我需要支持UITableViewAutomaticDimension(用于动态高度),约束条件有所不同:有些需要激活,有些不需要 我在安装了aConstraint而未安装bConstraint的情况下设置故事板。我会根据需要在表格视图(u:cellForRowAt:)中激活/停用它们 问题 初始可见布局将忽略所有这些激活/停用,并且所有单元格都与原始情节提要状态相同 您将注意到,只有在滚动之后才应用正确的约束 尝试 我确实尝试了一些cell.setNeedsUpdateConstraints()
UITableViewAutomaticDimension
(用于动态高度),约束条件有所不同:有些需要激活,有些不需要
我在安装了aConstraint
而未安装bConstraint
的情况下设置故事板。我会根据需要在表格视图(u:cellForRowAt:)
中激活/停用它们
问题
初始可见布局将忽略所有这些激活/停用,并且所有单元格都与原始情节提要状态相同
您将注意到,只有在滚动之后才应用正确的约束
尝试
我确实尝试了一些cell.setNeedsUpdateConstraints();cell.updateConstraintSifRequired();cell.layoutifneed()代码>
示例项目在上分享了在代码中设置约束的几个问题
1.
UILabel intrinsicContentSize将参与自动布局。
自动布局系统将基于intrinsicContentSize创建宽度和高度约束
您在xib文件中明确设置了标签的高度约束,导致了歧义,然后添加了垂直中心Y约束以解决问题
2.
如果要尝试激活或停用约束,可能需要使用简单的UIView
3.
如果您想做各种高度行,请利用intrinsicContentSize,并设置UILabel的preferredWidth。在代码中设置约束时有几个问题
1.
UILabel intrinsicContentSize将参与自动布局。
自动布局系统将基于intrinsicContentSize创建宽度和高度约束
您在xib文件中明确设置了标签的高度约束,导致了歧义,然后添加了垂直中心Y约束以解决问题
2.
如果要尝试激活或停用约束,可能需要使用简单的UIView
3.
如果您想做不同高度的行,请利用intrinsicContentSize,并设置UILabel的preferredWidth。设置同时安装了“aConstraint”和“bConstraint”的情节提要,但对“aConstraint”设置较低的优先级以删除警告,它可以工作:)设置同时安装了“aConstraint”和“bConstraint”的情节提要,但将优先级降低到“aConstraint”以删除警告,它就可以工作:)UILabel已在github上删除。问题的焦点是,在github上删除的ui标签之前,在cellForRowAt
中激活未安装的约束无效。问题的焦点是,在cellForRowAt
中激活未安装的约束在滚动完成之前无效。它在aConstraint
和bConstraint
设置为优先级999的情况下都有效。谢谢。它同时适用于优先级为999的aConstraint
和bConstraint
设置。谢谢
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.estimatedRowHeight = 10
tableView.rowHeight = UITableViewAutomaticDimension
}
}
}
class MyTableViewCell: UITableViewCell {
@IBOutlet var aConstraint: NSLayoutConstraint!
@IBOutlet var bConstraint: NSLayoutConstraint!
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as! MyTableViewCell
cell.contentView.translatesAutoresizingMaskIntoConstraints = false
if indexPath.row % 2 == 0 {
NSLayoutConstraint.deactivate([cell.aConstraint])
NSLayoutConstraint.activate([cell.bConstraint])
} else {
NSLayoutConstraint.deactivate([cell.bConstraint])
NSLayoutConstraint.activate([cell.aConstraint])
}
return cell
}
}