gpt4 book ai didi

ios - 为字形背景获得一致的大小

转载 作者:行者123 更新时间:2023-11-28 07:33:13 26 4
gpt4 key购买 nike

大家好 – 我是 TextKit 的新手,正在尝试围绕特定属性绘制背景和边框。我已经相当接近了,但还没有找到不会产生非常不一致的尺寸的方法,这往往看起来很糟糕。这是我的第一个尝试:

class MyLayout: NSLayoutManager {
override func drawBackground(forGlyphRange glyphsToShow: NSRange, at origin: CGPoint) {
super.drawBackground(forGlyphRange: glyphsToShow, at: origin)

guard let storage = textStorage else {
return
}
guard let context = UIGraphicsGetCurrentContext() else {
return
}

var codeBlockRect: CGRect? = nil
enumerateLineFragments(forGlyphRange: glyphsToShow) { (rect, usedRect, container, subRange, stop) in
var effectiveRange = NSRange()
let attributes = storage.attributes(at: subRange.location, effectiveRange: &effectiveRange)
storage.enumerateAttribute(.inlineCodeBlock, in: subRange) { (value, attributeRange, stop) in
guard value != nil else {
return
}
var background = self.boundingRect(forGlyphRange: attributeRange, in: container)
background.origin.x += origin.x
background.origin.y += origin.y

context.setFillColor(UIColor.lightGrey.cgColor)
context.setStrokeColor(UIColor.mediumGrey.cgColor)
context.stroke(background)
context.fill(background)
}
}
}
}

产生这些结果:

单行文字:
Single line of text

多行文本:
Multiple lines of text

如您所见,大小之间大约有 3 个像素的差异。我想这是因为 boundingRect,正如文档所说:

Returns the smallest bounding rect which completely encloses the glyphs in the given glyphRange

但我还没有找到一种方法可以给我一个更接近我正在寻找的数字。我的理想情况是每个矩形都具有完全相同的高度。

如果需要更多信息,请告诉我。

更新

我想到这可能与我们正在使用的专有字体有关,所以我将所有内容更改为使用 UIFont.systemFont,这没有任何区别。

最佳答案

我在这里找到了一个解决方法——我没有将我的 inlineCodeBlock 定义为背景,而是将其定义为自定义下划线样式。

这样做让我可以覆盖 drawUnderline(forGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:)

一旦我有了它,我就能够使用 baselineOffset 来获得一致的定位。

关于ios - 为字形背景获得一致的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com