2016-12-09 1 views
1

Я хотел бы иметь UILabel, прикрепленный к другому UIView, в настоящее время выложенному с помощью AutoLayout.Swift + Autolayout: поверните UILabel, держите его рядом с UIView

То, что я хотел бы достичь заключается в следующем:

enter image description here

Но если я только повернуть вид, он вращается вокруг центральной точки, и если изменить точку привязки, верхний вид перемещается , Как мне сначала планировать два вида с автозапуском, а затем сделать поворот?

В настоящее время autolayout выполняет следующие действия:

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