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动态高度