我不能同时包裹和对齐UILabel
中显示的UITableViewCell
。
我希望某些UILabel(以白色背景显示在下面)正确对齐 如果文字太长,请用文字换行。要澄清以下内容,请按以下步骤操作:
UILabel
和白色背景是我正在谈论的标签UITableView
具有类似粉红的背景ViewController
的{{1}}具有浅灰色背景两者都是正确的对齐方式,但是文字没有换行(实际上,“ Long ..”文字很长,请参见第二张屏幕截图)
或者文本正确换行,但没有正确对齐:
我的代码基于本教程:How to build a Table View with multiple cell types
在橙色背景显示的单元格代码中:
UITableView
我在class AttributeCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel?
@IBOutlet weak var valueLabel: UILabel?
let orange = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
var item: AttributeLabelLabel? {
didSet {
titleLabel?.backgroundColor = .white
titleLabel?.setLabel(contentText: (item?.attributeNameFromLocalizable)!, alignmentText: .right)
valueLabel?.backgroundColor = .green
valueLabel?.setLabel(contentText: (item?.attributeValue)!, alignmentText: .left)
self.backgroundColor = orange
}
}
static var nib:UINib {
return UINib(nibName: identifier, bundle: nil)
}
static var identifier: String {
return String(describing: self)
}
}
上添加了扩展名,以设置单元格上显示的两个标签的对齐方式和文本,所有标签的包装方式应相同。
标签下的扩展名是对齐的,但没有包裹(请参见上面的第一个屏幕截图)。
UILabel
如果我要包装文本,则必须添加对extension UILabel{
func setLabel(contentText: String, alignmentText: NSTextAlignment){
self.text = contentText
self.textAlignment = alignmentText
self.numberOfLines = 0
self.lineBreakMode = .byWordWrapping // inefficient alone
}
}
的调用,但是短标签(请参见带有文本“短”的标签)未正确对齐(请参见上面的第二张屏幕截图)
sizeToFit()
为什么我需要在文档中指定extension UILabel{
func setLabel(contentText: String, alignmentText: NSTextAlignment){
self.text = contentText
self.textAlignment = alignmentText
self.numberOfLines = 0
self.lineBreakMode = .byWordWrapping
self.sizeToFit() // allow text to be effectivly wrapped
}
}
?我发现只提到使用self.sizeToFit()
来包装文本?
由于我无法处理自动换行和文本对齐方式,因此我想到了将UILabel的宽度与其文本进行比较,并根据处理对齐方式(对于较短的文本)或自动换行(如果文字太长)。但是我没有找到如何获得UILabel的宽度。
另一个想法是创建一个自定义UILabel并在代码中设置所有约束,压缩和抵抗。目前没有任何限制:
是否可以同时处理文本换行和文本对齐?
在第二个屏幕截图中,带有换行文字的lineBreakMode
与单元格边界重叠。这不是第一个问题,我现在可以接受,但是如果有人对此有所提示...
我实际上使用以下代码来处理具有不同高度的单元格:
UILabel
答案 0 :(得分:1)
您缺少一些限制。
要包装多行标签,必须 限制其宽度(否则怎么会知道文本太长?)。
要获得自动布局以调整单元格的高度,您需要对单元格的内容进行约束以“向下推”单元格的底部。
所以...
Leading: 0
,Top: 0
,Width: 77
(根据您的图像,我使用的宽度为77)。Leading: 8
(到左上角的标签结尾),Top: 0
,Trailing: 0
Leading: 0
,Top: 8
(到左上角标签的底部),Width: 77
(或宽度等于左上角的标签)Leading: 8
(到左下标签的结尾),Top: 8
(到右上标签的底部,或Top: 0
)到左下标签的顶部),Trailing: 0
然后,将Bottom
的{{1}}约束添加到每个底部标签。
我猜测底部标签可能会缠绕成多行,因此将每个标签设置为>= 0
布局:
结果:
答案 1 :(得分:0)