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?
Je mets ma réponse dans un format similaire à cette réponse .
Voici l'étiquette originale:
Tourner de 90 degrés dans le sens des aiguilles d'une montre:
yourLabelName.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2)
Tourner à 180 degrés:
yourLabelName.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
Tourner de 90 degrés dans le sens antihoraire:
yourLabelName.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2)
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)
où 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ésCGFloat.pi / 2
= π/2 = 90 degrésMise 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
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)
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)
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
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)