Swift: ¿Cómo se puede rotar el texto para UIButton y UILabel?

¿Cómo se puede rotar el texto para UIButton y UILabel ? 90 grados, 180 grados

Nota: Antes de marcar esto como un duplicado, estoy modelando intencionalmente mi pregunta como una versión Swift de esta: Objetivo C: ¿Cómo se puede rotar el texto para UIButton y UILabel?

Estoy poniendo mi respuesta en un formato similar a esta respuesta .

Aquí está la etiqueta original:

enter image description here

Gire 90 grados en el sentido de las agujas del reloj:

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

enter image description here

Gira 180 grados:

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

enter image description here

Gire 90 grados en sentido antihorario:

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

enter image description here

Haga lo mismo para girar un botón. Afortunadamente, los eventos táctiles también se rotan para que el botón siga siendo clicable en sus nuevos límites sin tener que hacer nada extra.

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

Notas:

Documentación para CGAffineTransform

El formato básico es CGAffineTransform(rotationAngle: CGFloat) donde rotationAngle está en radianes, no en grados.

Hay 2π radianes en un círculo completo (360 grados). Swift incluye la constante útil CGFloat.pi .

  • CGFloat.pi = π = 180 grados
  • CGFloat.pi / 2 = π / 2 = 90 grados

Diseño automático:

El diseño automático no funciona con vistas giradas. (Consulte Frame vs Bounds para obtener una explicación de por qué.) Este problema se puede resolver creando una vista personalizada. Esta respuesta muestra cómo hacerlo para una UITextView , pero es el mismo concepto básico para una etiqueta o botón. (Tenga en cuenta que deberá eliminar la línea CGAffineTransformScale en esa respuesta ya que no necesita duplicar el texto).

Relacionado

  • ¿Cómo hacer transformaciones en un CALayer?
  • Cómo aplicar múltiples transformaciones en Swift
  • CTM transforma frente a Affine Transforms en iOS (para traducir, rotar, escalar)

rápido

Gire 90 grados en el sentido de las agujas del reloj:

  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) 

Gire 90 grados en sentido antihorario:

  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) 

Si haces esto mucho, querrás hacer una extensión. También esto le permitirá rotar su vista 0-360 grados.

 extension UIView { func rotate(degrees: CGFloat) { rotate(radians: CGFloat.pi * degrees / 180.0) } func rotate(radians: CGFloat) { self.transform = CGAffineTransform(rotationAngle: radians) } } 

Entonces simplemente puede llamar rotar en sus puntos de vista

 myView.rotate(degrees: 90) 

Adaptó la respuesta de Ananthu R Krishnan para encajar en Swift 3.1.

Gire 90 grados en sentido antihorario:

 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)