UILabel不能同时包装和对齐

时间:2019-01-07 15:31:51

标签: ios swift uilabel text-alignment textwrapping

我不能同时包裹和对齐UILabel中显示的UITableViewCell

我希望某些UILabel(以白色背景显示在下面)正确对齐 如果文字太长,请用文字换行。要澄清以下内容,请按以下步骤操作:

  • UILabel和白色背景是我正在谈论的标签
  • 我正在使用两种不同类型的电池(分别具有蓝色和橙色背景)
  • UITableView具有类似粉红的背景
  • 显示ViewController的{​​{1}}具有浅灰色背景

两者都是正确的对齐方式,但是文字没有换行(实际上,“ Long ..”文字很长,请参见第二张屏幕截图)

enter image description here

或者文本正确换行,但没有正确对齐:

enter image description here

我的代码基于本教程: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并在代码中设置所有约束,压缩和抵抗。目前没有任何限制:

enter image description here

enter image description here 有人已经处理过此类问题吗?

是否可以同时处理文本换行和文本对齐?

注意:

在第二个屏幕截图中,带有换行文字的lineBreakMode与单元格边界重叠。这不是第一个问题,我现在可以接受,但是如果有人对此有所提示... 我实际上使用以下代码来处理具有不同高度的单元格:

UILabel

2 个答案:

答案 0 :(得分:1)

您缺少一些限制。

要包装多行标签,必须 限制其宽度(否则怎么会知道文本太长?)。

要获得自动布局以调整单元格的高度,您需要对单元格的内容进行约束以“向下推”单元格的底部。

所以...

  • 将左上角的标签限制为Leading: 0Top: 0Width: 77(根据您的图像,我使用的宽度为77)。
  • 将右上角的标签限制为Leading: 8(到左上角的标签结尾),Top: 0Trailing: 0
  • 将左下角的标签限制为Leading: 0Top: 8(到左上角标签的底部),Width: 77(或宽度等于左上角的标签)
  • 将您的右下标签限制为Leading: 8(到左下标签的结尾),Top: 8(到右上标签的底部,或Top: 0)到左下标签的顶部),Trailing: 0

然后,将Bottom的{​​{1}}约束添加到每个底部标签。

我猜测底部标签可能会缠绕成多行,因此将每个标签设置为>= 0

布局:

enter image description here

结果:

enter image description here

答案 1 :(得分:0)

UILabel绝对可以右对齐并换行。这是一个示例:

enter image description here

实际上,标签内容包含四行内容,因此具有误导性! ;-)

这可以通过自动布局约束和UILabel上的正确设置来实现。特定的UILabel受以下约束:

  • 垂直居中
  • 领先的超级视图
  • 宽度

以下是约束,如“界面生成器”中所示:

enter image description here

最后,要使UILabel换行到多行,需要通过Interface Builder或代码将其numberOfLines属性设置为0。

您还可以使用textAlignment属性使文本右对齐,再次通过Interface Builder或代码将其设置为.right