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()