Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边

Posted

技术标签:

【中文标题】Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边【英文标题】:Swift + Autolayout: Rotate UILabel, keep it next to UIView 【发布时间】:2016-12-09 15:01:03 【问题描述】:

我想将一个 UILabel 附加到另一个 UIView,目前使用 AutoLayout 进行布局。

我想要达到的目标如下:

但是如果我只旋转视图,它会围绕中心点旋转,如果我改变锚点,上面的视图会移动。我如何必须先使用自动布局来布局两个视图,然后再进行旋转?

目前,自动布局执行以下操作:

使用以下代码:

    label.layer.anchorPoint = CGPoint(x: 0, y: 0)
    label.layer.transform = CATransform3DMakeRotation(CGFloat(-45 / 180.0 * CGFloat(M_PI)), 0, 0, 1)

我确实得到了类似的东西

【问题讨论】:

首先我认为你的锚点应该是 (0,1) 而不是 (0,0) > developer.apple.com/library/content/documentation/Cocoa/…(在 ios 和 OS X 中不同)。 您的观点是如何附加的?受哪些约束?你不能转换标签而不是图层吗? 【参考方案1】:

不要更改锚点,因为这会打乱自动布局。

相反,在你的变换中补偿锚点的位置:

class ViewController: UIViewController 

    @IBOutlet var label: UILabel!
    @IBOutlet var slider: UISlider!

    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()
        updateTransform()
    

    @IBAction func sliderValueChanged(_ sender: Any) 
        updateTransform()
    

    private func updateTransform() 
        var transform = CGAffineTransform.identity
        let labelSize = label.bounds.size
        transform = transform.translatedBy(x: -labelSize.width / 2, y: labelSize.height / 2)
        transform = transform.rotated(by: -CGFloat(slider.value) * CGFloat.pi / 2)
        transform = transform.translatedBy(x: labelSize.width / 2, y: -labelSize.height / 2)
        label.transform = transform
    


结果:

【讨论】:

以上是关于Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边的主要内容,如果未能解决你的问题,请参考以下文章

UItableviewcell中的多行UIlabel使用Autolayout

IOS - UIView中使用AutoLayout的UILabel动态高度

在界面生成器中将标签旋转为横向

AutoLayout - 不旋转的 UIImageView

带有约束的 iOS 6.0 AutoLayout 问题:旋转时子视图消失

在自定义容器视图中旋转时 AutoLayout 不会调整视图大小?