如何旋转CATextLayer并保留它的大小?

时间:2018-02-26 03:30:57

标签: ios objective-c cgaffinetransform catextlayer

我有一个自定义视图,我用它来标记(绘制线条和其他图形)。视图控制器识别触摸和手势,并将信息传递给视图,以便它可以正确绘制自己。每个图都有一个标签(CATextLayer),上面有一些图形信息(例如行长)。

我向视图控制器添加了一个旋转手势识别器来旋转此绘图视图。我想旋转视图,但阻止标签旋转(因此它们相对于superview保持0.0度)。为此,我计算新的绘图视图相对于超视图的角度,并将标签的角度属性设置为负值,因此我可以相反地旋转它们。例如,视图旋转30度,然后我旋转标签-30度。

在负责绘制图形和设置标签的视图绘制方法中,每次需要重绘视图时,我都会为每个标签创建新的变换:

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformRotate(transform, self.angle); //self.angle - rotation angle in radians
transform = CGAffineTransformScale(transform, scale, scale); //scale label (need this for pinch gesture, works as expected)
label.transform = transform;

如果我将标签旋转90度,所有这些东西都有效。如果度数不是0,90,180等,则标签的框架会发生变化:收缩或放大,大角度甚至会消失。我明白,当你旋转矩形时,它的框架应该变得更大,因为它指向这里:Why after rotating UIImageView size is getting changed?

有没有办法阻止CATextLayer在旋转时改变其形状?

标签的正常位置: Normal position

旋转90度(一切都很好) 90 degrees

旋转到任意角度(标签框架是畸形的) enlarged label

2 个答案:

答案 0 :(得分:0)

框架不是非矩形旋转后的预期。

我为您的问题找到了三种可能的解决方案:

  1. 计算文字的正确尺寸,并通过为positionbounds分配适当的值来设置框架。
  2. 如果第一个解决方案没有帮助,请为每个文本图层的背景创建一个简单的CALayer
  3. 但如果您仅旋转图像并保持文本图层的旋转不变,则应该更容易。您可以通过将文本图层添加到图像图层的超级图层来实现此目的。使用此设置,您只需计算旋转后文本图层的新位置。
  4. 我不确定前两个解决方案是否切实可行,我更倾向于第三个解决方案。

答案 1 :(得分:0)

之所以出现此问题,是因为我在设置CATextLayer的变换后重置了它的原点。根据{{​​1}}属性文档:

如果此属性的值是除identity transform以外的任何值,则frame属性中的值是未定义的,应忽略。

要更改图层的位置,请使用其transform属性。