Свободное позиционирование текста внутри UILabel программно в Swift - PullRequest
0 голосов
/ 16 декабря 2018

Я создал подкласс UILabel, чтобы изменить выравнивание / положение текста внутри моих UILabel, но текст всегда выравнивается по верху.Я прочитал много тем, но не нашел кого-то, у кого такая же проблема, как у меня.

Похоже, что y origin в функции drawText моего подкласса игнорируется, когда я вызываю super.drawText(in: r).Я говорю это, потому что origin.x, size.width и size.height прямоугольника, который я отправляю super.drawText (), работают как положено

Снимок экрана с результатом , который я в настоящее время получаю с кодом ниже

Снимок экрана Что я хочу

Это мой подкласс 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 голосов
/ 16 декабря 2018

Ваш код в порядке, за исключением одной строки.При создании вашего ярлыка вы не можете установить

label.lineBreakMode = .byWordWrapping

и

label.numberOfLines = 1

Я не знаю, почему он ломается, но не логично переносить строки, когда есть только одна, так что может быть что-тоне запускается.

Вы можете сделать число строк 0 или число больше 1. Другой вариант - удалить .byWordWrapping.Любая из этих вещей даст вам ожидаемый результат.

...