首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CATextlayer是否设置行间距?

CATextlayer是否设置行间距?
EN

Stack Overflow用户
提问于 2013-07-22 12:12:53
回答 4查看 2.1K关注 0票数 6

我对CATextlayer有个问题。我为CATextlayer设置了wrapped == YES,它会自动为它设置多行。但是行距非常小,看起来非常糟糕。有没有办法为CATextlayer设置行距?谢谢。

EN

回答 4

Stack Overflow用户

发布于 2014-07-07 19:41:14

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

为了更好地控制如何渲染图层中的文本,您可以使用常规的CALayerNSAttributedString的绘制方法;例如:

代码语言:javascript
复制
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:YES]];
    [self.someAttributedString drawInRect:layer.bounds];
    [NSGraphicsContext restoreGraphicsState];
}
票数 3
EN

Stack Overflow用户

发布于 2021-01-06 21:23:23

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

代码语言:javascript
复制
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)
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-02-23 04:45:39

CATextLayer线条高度取决于字体的1 unit原生高度

通常使用名为"Geviert“的印刷单位类型来表示。

如果你能够编辑你的字体,当然你也可以设置lineheight。因为当Quartz解释/呈现您的字体时,将使用一个signet的单位大小最大单位大小。

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

所以,是的,没有其他方法可以让CATextLayer以本机方式打印其他行高。您总是必须使用一种变通方法,即读出NSString的"\n",并为下一行重新分配另一个CATextLayer,或者使用其他类在屏幕上打印文本,就像torof中的示例使用可以表达NSAttributedStringCAAttributedTextLayer一样。

Quartz渲染的Lineheight是一个相对大小,具体取决于字体。有些字体需要更多的行距,因为它们在圆圈和下划线图形中占很大的比重。如果这个相对线高不存在,你将不得不在每个文本打印时给出一个线高,而不是使用标准的1 unit * Geviert size + size below any sign (屏幕截图"Unterlänge")

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17779851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档