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