如何在不改变Label位置的前提下旋转其文本内容?
Label旋转后保持原位置的实现方案
直接对Label应用旋转变换会出现位置偏移,原因是变换默认围绕视图中心旋转,且旋转后宽高尺寸互换,打破了原有布局。以下是两种可靠的解决方式:
方法一:调整锚点并修正位置
通过修改图层锚点,让旋转围绕左上角(原布局的基准点)进行,同时修正中心位置避免偏移:
func rotateLabel(radians: CGFloat) { let originalCenter = rotateLabel.center // 将锚点设为左上角,确保旋转起点对齐原位置 rotateLabel.layer.anchorPoint = CGPoint(x: 0, y: 0) // 修正中心,抵消锚点变更带来的位置偏移 rotateLabel.center = originalCenter // 应用90度旋转变换 rotateLabel.transform = CGAffineTransform(rotationAngle: radians) }
方法二:旋转后修正Frame与Center
先执行旋转,再重新设置Label的宽高(旋转后宽高互换)并恢复原始中心:
func rotateLabel(radians: CGFloat) { let originalFrame = rotateLabel.frame let originalCenter = rotateLabel.center rotateLabel.transform = CGAffineTransform(rotationAngle: radians) // 替换宽高值,匹配旋转后的尺寸 rotateLabel.frame = CGRect( x: originalFrame.origin.x, y: originalFrame.origin.y, width: originalFrame.height, height: originalFrame.width ) // 恢复原始中心位置 rotateLabel.center = originalCenter }
AutoLayout适配方案
若Label使用AutoLayout约束,直接修改frame可能引发布局冲突,可通过交换宽高约束的方式处理:
假设已给Label添加widthConstraint和heightConstraint约束:
func rotateLabel(radians: CGFloat) { // 交换宽高约束的常量值 let tempWidth = widthConstraint.constant widthConstraint.constant = heightConstraint.constant heightConstraint.constant = tempWidth rotateLabel.transform = CGAffineTransform(rotationAngle: radians) // 强制更新布局 view.layoutIfNeeded() }
内容的提问来源于stack exchange,提问作者jerfin
相关产品推荐
相关产品推荐

