我有一个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."
请注意“ 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
答案 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