Iphone CATextlayer设置行间距?

Iphone CATextlayer设置行间距?,iphone,ios,catextlayer,Iphone,Ios,Catextlayer,我对CATextlayer有问题。我为CATextlayer设置了wrapped==是,并为此自动设置了多行。但是行距很小,看起来很糟糕。 有没有办法为CATextlayer设置行间距?谢谢。您可以参考以下教程: 我认为CATextLayer仅用于轻量级用途。您可以将其string属性设置为NSAttributedString,以更改某些属性,如字体和大小,但许多其他属性将被忽略,包括行距和行距 为了更好地控制层中文本的呈现方式,可以使用常规的CALayer和NSAttributedString

我对CATextlayer有问题。我为CATextlayer设置了wrapped==是,并为此自动设置了多行。但是行距很小,看起来很糟糕。
有没有办法为CATextlayer设置行间距?谢谢。

您可以参考以下教程:


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

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

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

像@spinacher一样,我注意到
CATextLayer
忽略了诸如行距之类的段落样式。我通过子类化CALayer并更直接地绘制属性字符串来解决这个问题。大部分代码都是从


CATextLayer
lineheight取决于字体的原始高度
1个单位

通常用名为“Geviert”的印刷单位类型表示

如果你可以编辑你的字体,当然你也可以设置线宽。因为当Quartz解释/呈现您的字体时,会使用一个符号的单位大小最大单位大小

抱歉,这是一个德语屏幕截图,显示的是一个字体编辑设置,字体高度只有6个像素,行距只有两个像素。即使是在字体创建软件中,也不能很明显地读出您所看到的线条高度。任何地方都没有2个像素作为线空间。。相反,此处给出了单位大小Geviert

所以是的,CATextLayer没有其他方法可以以原生方式打印其他线宽。您将始终需要通过读取NSString的
“\n”
,并为下一行重新分配另一个CATextLayer,或使用其他类在屏幕上打印文本,如torof的示例,使用
CAAttributedTextLayer
,可以表示
NSAttributedString
s

Quartz渲染的线宽是一个相对大小,具体取决于字体。 有些字体需要更多的线条空间,因为它们在圆圈和下划线图形中很重。如果不存在此相对线宽,则必须在每次文本打印时使用标准的
1单位*Geviert size+任何符号下方的大小来给出线宽(屏幕截图“Unterlänge”)


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

这根本不能回答问题。问题在于更改
CATextLayer
的行距,而不是计算特定宽度的高度…ps:屏幕截图是从glyphs mini中生成的。
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)
    }
}