CATextlayer设置行间距?

时间:2013-07-22 04:12:53

标签: iphone ios catextlayer

我遇到CATextlayer问题。我为CATextlayer设置了wrap == YES,它为此自动设置多行。但行间距非常小,看起来很糟糕。 有没有办法为CATextlayer设置行间距?感谢。

4 个答案:

答案 0 :(得分:2)

我认为CATextLayer仅适用于轻量级用途。您可以将其string属性设置为NSAttributedString以更改某些属性,例如字体和大小,但会忽略许多其他属性,包括行高和间距。

为了更好地控制图层中文字的呈现方式,您可以使用常规CALayerNSAttributedString的绘图方法;例如:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:YES]];
    [self.someAttributedString drawInRect:layer.bounds];
    [NSGraphicsContext restoreGraphicsState];
}

答案 1 :(得分:0)

您可以参考以下教程:

Height-for-width layout with CATextLayer

答案 2 :(得分:0)

像@spinacher 一样,我注意到 CATextLayer 忽略了像行距这样的段落样式。我通过继承 CALayer 并更直接地绘制属性字符串来解决这个问题。大部分代码复制自 this article

class CAAttributedTextLayer: CALayer {
    
    public var attrString = NSAttributedString(string: "")
    
    override func draw(in ctx: CGContext) {
        
        // Flip the coordinate system
        ctx.textMatrix = .identity
        ctx.translateBy(x: 0, y: bounds.size.height)
        ctx.scaleBy(x: 1.0, y: -1.0)
        
        let path = CGMutablePath()
        path.addRect(bounds)
        
        let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
        let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil)
        CTFrameDraw(frame, ctx)
    }
}

答案 3 :(得分:0)

CATextLayer 行高取决于您的字体原生高度 1 unit
通常用名为“Geviert”的印刷单元类型表示。

如果您能够编辑字体 - 当然您也可以设置行高。因为当 Quartz 解释/渲染您的字体时,会使用一个印章的单位尺寸最大单位尺寸。

enter image description here

对不起,德语屏幕截图,字体编辑设置为只有 6 像素高度和 2 像素行距的字体。即使在字体创建软件中,如您所见,读出行高也不是很明显。没有任何地方给出 2 个像素作为线空间......相反,这里给出了单位大小的 Geviert。

所以是的,没有其他方式 CATextLayer 可以以本机方式打印其他行高。您将始终需要通过读取 NSString 的 "\n" 并为下一行重新分配另一个 CATextLayer 或使用其他类在屏幕上打印文本来使用解决方法,例如 torof 带有可以表达 CAAttributedTextLayers

NSAttributedString

Quartz Rendering 的 Lineheight 是一个取决于字体的相对大小。 有些字体需要更多的行距,因为它们在圆圈和下划线图形中很重。如果此相对行高不存在,则您必须在每个文本打印时指定行高,而不是使用标准 1 unit * Geviert size + size below any sign(屏幕截图“Unterlänge”)

当您可以编辑字体文件并将提到的 Geviert 大小设置为您希望的值时,CATextLayer 将始终以完美的行高呈现。这在您为 LCD 或其他低像素显示器创建图像缓冲区时非常方便。