我有一个自定义视图,我用它来标记(绘制线条和其他图形)。视图控制器识别触摸和手势,并将信息传递给视图,以便它可以正确绘制自己。每个图都有一个标签(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
在旋转时改变其形状?
答案 0 :(得分:0)
框架不是非矩形旋转后的预期。
我为您的问题找到了三种可能的解决方案:
position
和bounds
分配适当的值来设置框架。CALayer
。我不确定前两个解决方案是否切实可行,我更倾向于第三个解决方案。
答案 1 :(得分:0)
之所以出现此问题,是因为我在设置CATextLayer
的变换后重置了它的原点。根据{{1}}属性文档:
如果此属性的值是除identity transform以外的任何值,则frame属性中的值是未定义的,应忽略。
要更改图层的位置,请使用其transform
属性。