我正在努力尝试了解如何绘制旋转且适当大小的CATextLayer。 “适当大小”是指CATextLayer的框架大小恰好适合文本。
在下面的示例中,我试图绘制旋转55度的数字“ 12”(出于显而易见的原因)。 textLayer是CATextLayer。我将背景涂成黑色只是为了可视化框架。此代码段被称为layoutSubviews()的一部分。
print("configureTextLayer")
textLayer.string = "12"
textLayer.font = CTFontCreateWithName("Futura-Medium" as CFString, 120.0, nil) // fontSize seemingly ignored here
textLayer.fontSize = CGFloat(120.0)
textLayer.foregroundColor = UIColor.red.cgColor
textLayer.backgroundColor = UIColor.black.cgColor
textLayer.alignmentMode = kCAAlignmentCenter
let frameSize = textLayer.preferredFrameSize()
print("frameSize: \(frameSize)")
textLayer.frame = CGRect(x: 0, y: 0, width: frameSize.width, height: frameSize.height)
// Translate and rotate within superlayer, needs to be calculated based on number, hour|minute, size and appearance
textLayer.position = CGPoint(x: layer.frame.width/2, y: layer.frame.height/2) // centred at clock middle for debugging
textLayer.transform = CATransform3DMakeRotation(degreesToRadians(55.0), 0, 0, 1)
在应用程序启动时,此代码(即layoutSubviews)被调用两次,如以下控制台代码所示:
configureTextLayer
frameSize: (140.0, 160.0)
configureTextLayer
frameSize: (-50.0, 206.0)
注意两次调用之间的preferredFrameSize有何不同。第一个似乎是正确的。即,它将完全适合未旋转的“ 12”。第二个更高和更窄(和负宽度)。该高度可能是您期望的55度旋转140x160矩形的笛卡尔高度。
如果将轮播设置为90.0,则会得到以下信息:
并在控制台中:
configureTextLayer
frameSize: (140.0, 160.0)
configureTextLayer
frameSize: (-159.0, 140.0)
在我看来,...
...我正在写这句话,但有一个顿悟;-)也就是说,在第二次调用此代码时,对上一个调用的转换仍然有效。作为测试,我在调用preferredFrameSize方法之前插入了这一行。
textLayer.transform = CATransform3DIdentity
瞧,这是我现在55度旋转的角度“ 12”:
现在控制台显示了预期的结果:
configureTextLayer
frameSize: (140.0, 160.0)
configureTextLayer
frameSize: (140.0, 160.0)
我要发布此信息,因为我想知道这种文本旋转方法是否有意义。对我来说,这似乎是很多工作……但是我是Swift和iOS开发的新手,所以也许这就是事实。也许其他人会偶然发现这一点,对他们有帮助。
干杯, 达兰。