2016-12-09 91 views
1

我想有一個UILabel附加到另一個UIView,目前與AutoLayout鋪設。Swift + Autolayout:旋轉UILabel,保持它旁邊的UIView

我想什麼來實現如下:

enter image description here

但如果我只旋轉視圖,它是圍繞中心點旋轉,如果我改變錨點,上面觀移動。我該如何首先使用自動佈局佈局兩個視圖,然後進行旋轉?

目前,自動佈局將執行以下操作:

enter image description here

用下面的代碼:

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

我得到類似

enter image description here

+0

首先,我認爲你的定位點應爲(0,1),而不是(0 ,0)> https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics/CoreAnimationBasics.html(在iOS和OS X中不同)。 –

+0

您的觀點如何附加?通過哪些約束?你不能轉換標籤而不是圖層嗎? –

回答

6

不要改變定位點,因爲這會搞亂自動佈局。

相反,在補償錨點的位置您的轉換:

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 
    } 

} 

結果:

demo of rotated label