Swift: Как вы можете вращать текст для UIButton и UILabel?

Как вы можете повернуть текст для UIButton а также UILabel? 90 градусов, 180 градусов

Примечание. Прежде чем пометить это как дубликат, я намеренно смоделирую свой вопрос как версию Swift этого: Цель C: Как вы можете повернуть текст для UIButton и UILabel?

6 ответов

Решение

Я помещаю свой ответ в формате, аналогичном этому ответу.

Вот оригинальная этикетка:

Повернуть на 90 градусов по часовой стрелке:

yourLabelName.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2)

Поворот на 180 градусов:

yourLabelName.transform = CGAffineTransform(rotationAngle: CGFloat.pi)

Повернуть на 90 градусов против часовой стрелки:

yourLabelName.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2)

Сделайте то же самое, чтобы повернуть кнопку. К счастью, сенсорные события также вращаются, поэтому кнопка по-прежнему кликабельна в новых границах без необходимости делать что-либо дополнительное.

yourButtonName.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2)

Заметки:

Документация для CGAffineTransform

Основной формат CGAffineTransform(rotationAngle: CGFloat) где rotationAngle в радианах, а не в градусах.

В круге 2π радиана (360 градусов). Swift включает в себя полезную константу CGFloat.pi,

  • CGFloat.pi = π = 180 градусов
  • CGFloat.pi / 2 = π/2 = 90 градусов

Авто макет:

Автоматический макет не работает с повернутыми видами. (См. Frame против Bounds для объяснения почему.) Эта проблема может быть решена путем создания настраиваемого представления. Этот ответ показывает, как это сделать для UITextView, но это та же основная концепция для ярлыка или кнопки. (Обратите внимание, что вам придется удалить CGAffineTransformScale строка в этом ответе, так как вам не нужно зеркально отражать текст.)

связанные с

Если вы делаете это много, вы не захотите делать расширение. Также это позволит вам повернуть ваш взгляд на 0-360 градусов.

extension UIView {
    func rotate(degrees: CGFloat) {
        rotate(radians: CGFloat.pi * degrees / 180.0)
    }

    func rotate(radians: CGFloat) {
        self.transform = CGAffineTransform(rotationAngle: radians)
    }
}

Тогда вы можете просто позвонить вращаться на ваши взгляды

myView.rotate(degrees: 90)

быстрый

Повернуть на 90 градусов по часовой стрелке:

    var rotateLabel: UILabel = UILabel(frame: CGRectMake(100, 0, 28, 159))

    rotateLabel.textAlignment = .Right

    rotateLabel.text = "Hello!"

    self.view.addSubview(rotateLabel)

    rotateLabel.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))

    rotateLabel.frame = CGRectMake(100, 0, 28, 159)

Повернуть на 90 градусов против часовой стрелки:

    var rotateLabel: UILabel = UILabel(frame: CGRectMake(100, 0, 28, 159))

    rotateLabel.textAlignment = .Right

    rotateLabel.text = "Hello!"

    self.view.addSubview(rotateLabel)

    rotateLabel.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2))

    rotateLabel.frame = CGRectMake(100, 0, 28, 159)

Я бы предложил использовать расширение с вариантами градусов и против часовой стрелки

func rotate(degrees: Int , clockwise: Bool)
{
    let x  = 180 / degrees
    if clockwise == true
    {
        self.transform = CGAffineTransform(rotationAngle: CGFloat.pi / CGFloat(x))
    }
    else
    {
        self.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / CGFloat(x))
    }
}

Я использую это как extension UILabel {} но это, очевидно, зависит от вас

Адаптировал ответ от Ananthu R Krishnan, чтобы он соответствовал Swift 3.1.

Повернуть на 90 градусов против часовой стрелки:

let rotateLabel: UILabel = UILabel(frame: CGRect(x:15, y:66, width:28, height:159))
rotateLabel.textAlignment = .right
rotateLabel.text = "TEXT"
self.view.addSubview(rotateLabel)
rotateLabel.transform = CGAffineTransform(rotationAngle: CGFloat(-(Double.pi / 2.0)))
rotateLabel.frame = CGRect(x:15, y:66, width:28, height:159)

Если вы используете собственный шрифт, вам могут понадобиться:

      rotateLabel.sizeToFit()
Другие вопросы по тегам