我创建了UILabel的子类来更改文本在UILabels中的对齐方式/位置,但是文本始终始终是顶部对齐的。我读了很多主题,但没有找到同样的问题遇到我的人。
当我调用super.drawText(in: r)
时,子类的drawText函数的y起源似乎被忽略了。我说这是因为我发送给super.drawText()的矩形的origin.x,size.width和size.height正常工作
result I currently get with the code below
的屏幕截图 的屏幕截图这是我的UILabel子类:
class Label : UILabel {
enum VerticalAlignment {
case top
case middle
case bottom
}
enum HorizontalAlignment {
case left
case center
case right
}
var verticalAlignment: VerticalAlignment = .middle {
didSet { setNeedsDisplay() }
}
var horizontalAlignment: HorizontalAlignment = .center {
didSet { setNeedsDisplay() }
}
override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
var rect: CGRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)
rect = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
switch verticalAlignment {
case .top:
break
case .middle:
rect.origin.y += ((bounds.size.height - rect.size.height) / 2.0)
case .bottom:
rect.origin.y += (bounds.size.height - rect.size.height)
}
switch horizontalAlignment {
case .left:
break
case .center:
rect.origin.x += ((bounds.size.width - rect.size.width) / 2.0)
case .right:
rect.origin.x += (bounds.size.width - rect.size.width)
}
return rect
}
override func drawText(in rect: CGRect) {
let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
super.drawText(in: r)
}
}
我如何创建标签:
func addtestLabel() {
var label: Label = Label()
label.text = "NICE LABEL!"
label.textColor = hexToUIColor(hex: "#ffffff")
label.frame = CGRect(x: 35, y: self.view.bounds.size.height - 120, width: self.view.bounds.size.width - 70, height: 75)
label.backgroundColor = hexToUIColor(hex: "#000000")
label.font = UIFont(name: "Savu-Condensed", size: label.frame.size.height / 2.0)
label.lineBreakMode = .byWordWrapping
label.numberOfLines = 1
self.view.addSubview(label)
}
答案 0 :(得分:0)
除了一行以外,您的代码都可以。创建标签时,您无法设置
label.lineBreakMode = .byWordWrapping
和
label.numberOfLines = 1
我不知道为什么会中断,但是只有一行时换行是不合逻辑的,因此可能不会触发某些事情。
您可以使行数为0或大于1的数。另一种选择是删除.byWordWrapping。这些东西中的任何一个都会给您您所期望的结果。