在Swift中以编程方式在UILabel中自由定位文本

时间:2018-12-16 15:22:03

标签: ios swift alignment uilabel

我创建了UILabel的子类来更改文本在UILabels中的对齐方式/位置,但是文本始终始终是顶部对齐的。我读了很多主题,但没有找到同样的问题遇到我的人。

当我调用super.drawText(in: r)时,子类的drawText函数的y起源似乎被忽略了。我说这是因为我发送给super.drawText()的矩形的origin.x,size.width和size.height正常工作

result I currently get with the code below

的屏幕截图

what I want

的屏幕截图

这是我的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)
}

1 个答案:

答案 0 :(得分:0)

除了一行以外,您的代码都可以。创建标签时,您无法设置

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 1

我不知道为什么会中断,但是只有一行时换行是不合逻辑的,因此可能不会触发某些事情。

您可以使行数为0或大于1的数。另一种选择是删除.byWordWrapping。这些东西中的任何一个都会给您您所期望的结果。