如何创建UILabel动态高度和布局锚点约束?

时间:2019-08-05 21:04:45

标签: ios swift

我有一个UILabel,它使用不同长度的文本进行更新,并使用布局锚点约束定位。我无法获得正确的身高。有时最后一行被切断,但并非总是如此。

定义标签

message.textAlignment = .center
message.numberOfLines = 0
message.preferredMaxLayoutWidth = frame.width
message.lineBreakMode = .byWordWrapping
popUpWindow.addSubview(message)

message.translatesAutoresizingMaskIntoConstraints = false
message.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: POP_UP.SPACING_Y).isActive = true
message.leftAnchor.constraint(equalTo: layoutGuide.leftAnchor, constant: POP_UP.EDGE_INSET).isActive = true
message.rightAnchor.constraint(equalTo: layoutGuide.rightAnchor, constant: -POP_UP.EDGE_INSET).isActive = true
message.bottomAnchor.constraint(equalTo: cancel.topAnchor, constant: -POP_UP.SPACING_Y).isActive = true```

更新文本。 newText的长度有所不同。

message.text = newText
message.sizeToFit()
setNeedsLayout()

样本输入:

newText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."

enter image description here

请注意“ ut Labore et dolore magna aliqua”。被切断。

(完整的布局约束供参考)

let layoutGuide = popUpWindow.safeAreaLayoutGuide

popUpWindow.translatesAutoresizingMaskIntoConstraints = false
popUpWindow.centerXAnchor.constraint(equalTo: safeAreaLayoutGuide.centerXAnchor).isActive = true
popUpWindow.centerYAnchor.constraint(equalTo: safeAreaLayoutGuide.centerYAnchor).isActive = true
popUpWindow.widthAnchor.constraint(equalTo: safeAreaLayoutGuide.widthAnchor, multiplier: 0.75).isActive = true

imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.topAnchor.constraint(equalTo: layoutGuide.topAnchor, constant: POP_UP.EDGE_INSET).isActive = true
imageView.centerXAnchor.constraint(equalTo: popUpWindow.centerXAnchor).isActive = true
imageView.widthAnchor.constraint(equalTo: popUpWindow.widthAnchor, multiplier: 0.35).isActive = true

message.translatesAutoresizingMaskIntoConstraints = false
message.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: POP_UP.SPACING_Y).isActive = true
message.leftAnchor.constraint(equalTo: layoutGuide.leftAnchor, constant: POP_UP.EDGE_INSET).isActive = true
message.rightAnchor.constraint(equalTo: layoutGuide.rightAnchor, constant: -POP_UP.EDGE_INSET).isActive = true
message.bottomAnchor.constraint(equalTo: cancel.topAnchor, constant: -POP_UP.SPACING_Y).isActive = true

cancel.translatesAutoresizingMaskIntoConstraints = false
cancel.topAnchor.constraint(equalTo: message.bottomAnchor, constant: POP_UP.SPACING_Y).isActive = true
cancel.leftAnchor.constraint(equalTo: layoutGuide.leftAnchor, constant: POP_UP.EDGE_INSET).isActive = true
cancel.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor, constant: -POP_UP.EDGE_INSET).isActive = true

ok.translatesAutoresizingMaskIntoConstraints = false
ok.topAnchor.constraint(equalTo: message.bottomAnchor, constant: POP_UP.SPACING_Y).isActive = true
ok.rightAnchor.constraint(equalTo: layoutGuide.rightAnchor, constant: -POP_UP.EDGE_INSET).isActive = true
ok.leftAnchor.constraint(equalTo: cancel.rightAnchor, constant: POP_UP.SPACING_X).isActive = true
ok.heightAnchor.constraint(equalTo: cancel.heightAnchor).isActive = true
ok.widthAnchor.constraint(equalTo: cancel.widthAnchor).isActive = true

更新: 我注意到我的首选宽度与左右约束锚之间存在不匹配,这可能导致计算出的高度比应该的短。

如果有人遇到相同问题,这是我所做的更新:

更改了首选宽度:

message.preferredMaxLayoutWidth = frame.width * 0.5

删除了左右锚点约束,并添加了宽度约束,以确保其值与PreferredMaxLayoutWidth完全相同:

message.widthAnchor.constraint(equalToConstant: frame.width * 0.5).isActive = true
message.centerXAnchor.constraint(equalTo: layoutGuide.centerXAnchor).isActive = true

1 个答案:

答案 0 :(得分:0)

您正在设置相对于其他视图的约束。如果其他视图的高度固定,则我不希望UILabel的大小适合文本。 我将像这样设置底部和顶部约束

message.topAnchor.constraint(greaterThanOrEqualTo: imageView.bottomAnchor, constant: POP_UP.SPACING_Y).isActive = true
message.bottomAnchor.constraint(greaterThanOrEqualTo: cancel.topAnchor, constant: -POP_UP.SPACING_Y).isActive = true

请参阅:https://developer.apple.com/documentation/uikit/nslayoutanchor/1500948-constraint