如何在 Swift 中旋转 UIButton 和 UILabel 的文本?

How can you rotate text for UIButton and UILabel in Swift?

如何旋转 UIButtonUILabel 的文本? 90度,180度。

注意: 在您将此标记为重复之前,我有意将我的问题建模为此问题的 Swift 版本:How can you rotate text for UIButton and UILabel in Objective-C?

我的回答格式类似于 this answer

这是原始标签:

顺时针旋转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 的单位是弧度,而不是度数。

一个完整的圆(360度)有2π弧度。 Swift 包括有用的常量 CGFloat.pi.

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

自动布局:

自动布局不适用于旋转视图。 (请参阅 Frame vs Bounds for an explanation why.) This problem can be solved by creating a custom view. 展示了如何为 UITextView 执行此操作,但它与标签或按钮的基本概念相同。(请注意,您必须删除其中的 CGAffineTransformScale 行回答因为你不需要镜像文本。)

相关

swift

顺时针旋转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)

改编 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)

如果你经常这样做,你就不会想要延期了。此外,这将允许您将视图旋转 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)

我建议使用带有 degrees 和 counter/clockwise

选项的扩展
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))
    }
}

我将其用作 extension UILabel {} 但这显然取决于您

如果您使用自定义字体,您可能需要:

rotateLabel.sizeToFit()