web-dev-qa-db-fra.com

Comment faire pivoter du texte pour UIButton et UILabel dans Swift?

Comment faire pivoter le texte pour UIButton et UILabel? 90 degrés, 180 degrés.

Remarque: Avant de marquer ceci en double, je modélise intentionnellement ma question comme une version Swift de celle-ci: Comment faire pivoter du texte pour UIButton et UILabel dans Objective-C?

54
Suragch

Je mets ma réponse dans un format similaire à cette réponse .

Voici l'étiquette originale:

enter image description here

Tourner de 90 degrés dans le sens des aiguilles d'une montre:

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

enter image description here

Tourner à 180 degrés:

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

enter image description here

Tourner de 90 degrés dans le sens antihoraire:

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

enter image description here

Faites la même chose pour faire pivoter un bouton. Heureusement, les événements tactiles sont également soumis à une rotation afin que le bouton puisse toujours être cliqué dans ses nouvelles limites sans avoir à faire quoi que ce soit.

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

Remarques:

Documentation sur CGAffineTransform

Le format de base est CGAffineTransform(rotationAngle: CGFloat)rotationAngle est exprimé en radians et non en degrés.

Il y a 2π radians dans un cercle complet (360 degrés). Swift inclut la constante utile CGFloat.pi.

  • CGFloat.pi = π = 180 degrés
  • CGFloat.pi / 2 = π/2 = 90 degrés

Mise en page automatique:

La mise en page automatique ne fonctionne pas avec les vues pivotées. (Voir Frame vs Bounds pour une explication.) Ce problème peut être résolu en créant une vue personnalisée. Cette réponse montre comment le faire pour une UITextView, mais c'est le même concept de base pour une étiquette ou un bouton. (Notez que vous devrez supprimer la ligne CGAffineTransformScale dans cette réponse car vous n'avez pas besoin de refléter le texte.)

En relation

161
Suragch

Rapide

Tourner de 90 degrés dans le sens des aiguilles d'une montre:

    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)

Tourner de 90 degrés dans le sens antihoraire:

    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)
6
Ananthu R Krishnan

Si vous faites cela souvent, vous ne ferez pas de prolongation. Cela vous permettra également de faire pivoter votre vue de 0 à 360 degrés.

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

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

Ensuite, vous pouvez simplement appeler une rotation sur vos vues

myView.rotate(degrees: 90)
3
drees

Je suggère d'utiliser l'extension avec des options de degrés et dans le sens inverse des aiguilles d'une montre

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

Je l'utilise comme extension UILabel {} mais cela dépend évidemment de vous

2
DeepBlue

Ananthu R Krishnan a adapté la réponse à Swift 3.1.

Tourner de 90 degrés dans le sens antihoraire:

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)
0
boehlefeld