我正在尝试构建一个可能看起来像这样的 Inkscape 模型的自定义控件:
我正在做一些事情,drawRect()
但我需要为一些元素设置动画,所以我决定切换到CALayer
s 的组合。我一直在使用CGContextRef
函数绘制文本,但是在切换到CATextLayer
每个字符后,我似乎无法正确转换它们。
我的一般方法是为每个角色创建一个CATextLayer
。我想我可以使用每一层preferredFrameSize()
来获得角色的最终大小。然后我想我会在我的控制layoutSubviews()
方法中调整它们的位置和旋转。
“我试过什么?” 我觉得我只是坐在旋转中,蒙着眼睛,投掷飞镖。你的名字,我试过了。
我可以通过以下方式确定每个角色的旋转角度:
let baseline = (self.ringBox.width * 3 / 8) // radius out to the baseline arc
let circumference = baseline * Tau
var advance = wordWidth.half.negated // wordWidth was summed from the width of each character earlier
let angle = 0.75.rotations
for each in self.autoCharacters {
let charSize = each.bounds.size
advance += charSize.width.half
let charRotation = (advance / circumference - 0.75).rotations + angle
...
}
我注意到这layoutSubviews()
似乎被调用了两次。为什么?我注意到第二次通过时,preferredFrameSize()
似乎更薄了。为什么?是不是因为我在设置它affineTransform
并且它具有累积效应。我试图最初将图层的位置设置为父框的中心,并将边界设置为preferredFrameSize,希望将其居中。然后应用变换。尽管多次尝试,我得到了奇怪的位置,以及奇怪的剪辑。
所以我只是在寻找一个简单/直截了当的配方,它将 aCATextLayer
从视图中心定位在给定的半径/角度。