Swift iOS - setContentHuggingPriority 优先处理错误的标签
Swift iOS - setContentHuggingPriority is prioritizing the wrong label
我有一个带有 4 个标签的单元格:
2 个独立的静态标签和 2 个独立的动态标签。 2 个静态标签中的文本总是显示 Receipt #,另一个显示 Receipt Date。
我设置它的方式是静态标签都将前导锚点固定到单元格的 contentView 的 leadingAnchor。他们都将 setContentHuggingPriority
设置为 High
并将 setContentCompressionResistancePriority
设置为 Low
。他们的 bottomAnchors 附加到每个匹配的动态标签的 lastBaseLineAnchor
动态标签都将其尾随锚点固定到 contentView 的尾随锚点。
receiptNumberLabel 的 leadingAnchor 固定到 receiptDateLabel 的 leadingAnchor。
receiptDateLabel 的 leadingAnchor 固定在距 staticReceiptDateLabel 10 点的位置。这个标签是应该灵活的标签,但事实并非如此。由于 receiptNumberLabels 的 leadingAnchor 遵循它,因此它也未对齐。
如您所见,staticReceiptDateLabel 更长,但它应该更短,而 receiptDateLabel 应该更长。我已经为 setContentHuggingPriority
和 setContentCompressionResistancePriority
的值尝试了不同的组合,但无论我不断得到这些结果,我该如何解决这个问题?
contentView.addSubview(receiptNumberLabel) // dynamic
contentView.addSubview(staticReceiptNumberLabel)
contentView.addSubview(receiptDateLabel) // dynamic
contentView.addSubview(staticReceiptDateLabel)
receiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: receiptDateLabel.leadingAnchor, constant: 0).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptNumberLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
receiptNumberLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.lastBaselineAnchor.constraint(equalTo: receiptNumberLabel.lastBaselineAnchor).isActive = true
staticReceiptNumberLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
staticReceiptNumberLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
receiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor, constant: 10).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptDateLabel.setContentHuggingPriority(UILayoutPriority.defaultLow, for: .horizontal)
receiptDateLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
staticReceiptDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptDateLabel.lastBaselineAnchor.constraint(equalTo: receiptDateLabel.lastBaselineAnchor).isActive = true
staticReceiptDateLabel.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .horizontal)
staticReceiptDateLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
更新
在评论中@bsod 建议根本不要使用 hugging/compression。我最初没有使用它们并且出现了同样的问题,我转而使用它们作为最后的手段。这是没有 hugging/compression.
的代码
receiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: receiptDateLabel.leadingAnchor, constant: 0).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.lastBaselineAnchor.constraint(equalTo: receiptNumberLabel.lastBaselineAnchor).isActive = true
receiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor, constant: 10).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
staticReceiptDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptDateLabel.lastBaselineAnchor.constraint(equalTo: receiptDateLabel.lastBaselineAnchor).isActive = true
忘记 hugging/compression API 并以此为起点。从 upper-left 标签开始,一直向下 left-to-right、top-to-bottom。请注意,静态日期标签的顶部锚点固定在收据编号值标签的底部,以防它有多行。
staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.topAnchor.constraint(equalTo: staticReceiptNumberLabel.topAnchor).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: staticReceiptNumberLabel.trailing, constant: 10).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
staticReceiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptNumberLabel.leadingAnchor).isActive = true
staticReceiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor).isActive = true
receiptDateLabel.topAnchor.constraint(equalTo: staticReceiptDateLabel.topAnchor).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptDateLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
您可能还需要将标题标签的 numberOfLines
显式设置为 1,否则 UIKit 可能会截断值标签,即使其 numberOfLines
为 0。
如果出于某种原因,您甚至不想扩大静态标签的大小,也许是因为您给它们设置了背景色,那么您可以引入 hugging/compression API。如果是这样,静态标签将是:
theStaticLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
theStaticLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
动态标签为:
theDynamicLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
theDynamicLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
我有一个带有 4 个标签的单元格:
2 个独立的静态标签和 2 个独立的动态标签。 2 个静态标签中的文本总是显示 Receipt #,另一个显示 Receipt Date。
我设置它的方式是静态标签都将前导锚点固定到单元格的 contentView 的 leadingAnchor。他们都将 setContentHuggingPriority
设置为 High
并将 setContentCompressionResistancePriority
设置为 Low
。他们的 bottomAnchors 附加到每个匹配的动态标签的 lastBaseLineAnchor
动态标签都将其尾随锚点固定到 contentView 的尾随锚点。
receiptNumberLabel 的 leadingAnchor 固定到 receiptDateLabel 的 leadingAnchor。
receiptDateLabel 的 leadingAnchor 固定在距 staticReceiptDateLabel 10 点的位置。这个标签是应该灵活的标签,但事实并非如此。由于 receiptNumberLabels 的 leadingAnchor 遵循它,因此它也未对齐。
如您所见,staticReceiptDateLabel 更长,但它应该更短,而 receiptDateLabel 应该更长。我已经为 setContentHuggingPriority
和 setContentCompressionResistancePriority
的值尝试了不同的组合,但无论我不断得到这些结果,我该如何解决这个问题?
contentView.addSubview(receiptNumberLabel) // dynamic
contentView.addSubview(staticReceiptNumberLabel)
contentView.addSubview(receiptDateLabel) // dynamic
contentView.addSubview(staticReceiptDateLabel)
receiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: receiptDateLabel.leadingAnchor, constant: 0).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptNumberLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
receiptNumberLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.lastBaselineAnchor.constraint(equalTo: receiptNumberLabel.lastBaselineAnchor).isActive = true
staticReceiptNumberLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
staticReceiptNumberLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
receiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor, constant: 10).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptDateLabel.setContentHuggingPriority(UILayoutPriority.defaultLow, for: .horizontal)
receiptDateLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
staticReceiptDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptDateLabel.lastBaselineAnchor.constraint(equalTo: receiptDateLabel.lastBaselineAnchor).isActive = true
staticReceiptDateLabel.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .horizontal)
staticReceiptDateLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
更新
在评论中@bsod 建议根本不要使用 hugging/compression。我最初没有使用它们并且出现了同样的问题,我转而使用它们作为最后的手段。这是没有 hugging/compression.
的代码receiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: receiptDateLabel.leadingAnchor, constant: 0).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.lastBaselineAnchor.constraint(equalTo: receiptNumberLabel.lastBaselineAnchor).isActive = true
receiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor, constant: 10).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
staticReceiptDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptDateLabel.lastBaselineAnchor.constraint(equalTo: receiptDateLabel.lastBaselineAnchor).isActive = true
忘记 hugging/compression API 并以此为起点。从 upper-left 标签开始,一直向下 left-to-right、top-to-bottom。请注意,静态日期标签的顶部锚点固定在收据编号值标签的底部,以防它有多行。
staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.topAnchor.constraint(equalTo: staticReceiptNumberLabel.topAnchor).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: staticReceiptNumberLabel.trailing, constant: 10).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
staticReceiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptNumberLabel.leadingAnchor).isActive = true
staticReceiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor).isActive = true
receiptDateLabel.topAnchor.constraint(equalTo: staticReceiptDateLabel.topAnchor).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptDateLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
您可能还需要将标题标签的 numberOfLines
显式设置为 1,否则 UIKit 可能会截断值标签,即使其 numberOfLines
为 0。
如果出于某种原因,您甚至不想扩大静态标签的大小,也许是因为您给它们设置了背景色,那么您可以引入 hugging/compression API。如果是这样,静态标签将是:
theStaticLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
theStaticLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
动态标签为:
theDynamicLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
theDynamicLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)