- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了在自定义 UIView 中定位/缩放字体字形,我需要知道一些字形指标,例如:- ascent(字形距基线的高度,例如“g”中位于基线上方的部分)- 下降(从基线开始的字形深度,例如基线下方的“g”部分)- 宽度- 字距调整- 斜体校正(斜体超出其宽度的字形部分)
我尝试子类化 NSLayoutManager
并从 drawGlyphs
中读取这些信息:
override func drawGlyphs(forGlyphRange glyphsToShow: NSRange, at origin: CGPoint) {
enumerateLineFragments(forGlyphRange: glyphsToShow) {
(rect, usedRect, textContainer, glyphRange, stop) in
for i in glyphsToShow.location ..< NSMaxRange(glyphsToShow) {
if let textContainer = self.textContainer(forGlyphAt: glyphsToShow.location, effectiveRange: nil) {
var glyphRect = self.boundingRect(forGlyphRange: NSMakeRange(i, 1), in:textContainer)
glyphRect.origin.x += origin.x;
glyphRect.origin.y += origin.y;
/// NOW I HAVE AT LEAST THE BOUNDING BOX
}
}
}
}
但是 glyphRect
对每个字形都有完全相同的宽度/高度,所以它带有最大(高度+深度)垂直空间和整个字体的最大宽度,这不是我需要的(我需要每个字形的这些信息:I 比 i 高,j 有深度,而 E 没有)。
是否可以通过 TextKit 收集这些信息?其他字体指标(字距调整、斜体校正)是否可用?
谢谢你的帮助,卢卡。
最佳答案
通常,您会使用 Core Text 而不是 NSLayoutManager 来执行此操作,至少对于宽度、上升和体面而言是这样。我将在下面讨论其他内容。
考虑一个属性字符串:
let string = NSAttributedString(string: "squids")
从那里我们想把它分解成“字形运行”。字形运行是一系列具有所有相同属性的字形。 (在这种情况下只有一个。)为此,首先创建一个 CTLine,然后请求 CTRun 对象:
let line = CTLineCreateWithAttributedString(string)
let glyphRuns = CTLineGetGlyphRuns(line) as! [CTRun]
每次运行都会有一个字体,这是我们查找指标所需要的,以及一个字形集合。这是调用代码的草图:
for run in glyphRuns {
let font = run.font!
let glyphs = run.glyphs()
let boundingRects = run.boundingRects(for: glyphs, in: font)
for pair in zip(glyphs, boundingRects) { print(pair) }
}
CTRun当然没有这么好的界面,所以我们需要把它做成一个扩展:
extension CTRun {
var font: CTFont? {
let attributes = CTRunGetAttributes(self) as! [CFString: Any]
guard let font = attributes[kCTFontAttributeName] else { return nil }
return (font as! CTFont)
}
func glyphs(in range: Range<Int> = 0..<0) -> [CGGlyph] {
let count = range.isEmpty ? CTRunGetGlyphCount(self) : range.count
var glyphs = Array(repeating: CGGlyph(), count: count)
CTRunGetGlyphs(self, CFRangeMake(range.startIndex, range.count), &glyphs)
return glyphs
}
func boundingRects(for glyphs: [CGGlyph], in font: CTFont) -> [CGRect] {
var boundingRects = Array(repeating: CGRect(), count: glyphs.count)
CTFontGetBoundingRectsForGlyphs(font, .default, glyphs, &boundingRects, glyphs.count)
return boundingRects
}
}
请记住,这些是指标。它们不是绘制字形的实际边界框。一些字体绘制在它们的框外(Zapfino 以它而闻名)。如果您想要实际的图像框,则需要 CTRunGetImageBounds
。还有 CTFontGetOpticalBoundsForGlyphs
,它会为您提供更有用的方框,以便正确排列事物(因为如果以与绘制方式不完全匹配的方式排列,字形通常看起来会更好)。
我假设您对这一切都很熟悉,但为了完整起见,请记住许多本身没有“下降”的事物仍然有下降。例如,在 Helvetica 中,“s”稍微下降到基线以下(还有“d”和许多其他具有弯曲底部的字形)。
对于您注意到的其他指标,其中一些不是字形指标。例如,单个字形没有自己的字距调整指标。字距调整是应用于字形对的。
同样,我真的不觉得这里适用斜体校正。在绝大多数情况下,您不会在 Cocoa 平台上使用“斜体”字体。您选择字体的斜体变体,但这是完全不同的字体。因此,您不对“斜体 Helvetica”应用间距校正。您只需替换 Helvetica-Oblique,它有自己的宽度等。(Cocoa 世界中没有 Helvetica-Italic,但有 HelveticaNeue-Italic。)我不知道 Cocoa 布局系统中的任何地方都有“斜体校正”。有些地方可能会很好,但我想不出它实际发生的地方。
关于swift - 使用 Swift 获取字体字形指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827123/
我在 Azure 中找不到几个 SQL 指标。任何人都可以帮助如何设置以下主题的指标。 1)产能利用率不足 2)池外的数据库数量 3)扩大规模 4)连接超时 提前致谢。 最佳答案 实际上,这些并不是
我要监控的应用程序提供了一个用于健康检查的 api 端点,它以 json 格式响应指标。例如: $ curl https://example.com/api/stats {"status":"suc
我正在考虑用于分析软件开发工作的软件指标。当我考虑在面向对象的软件中使用类似功能点的指标时,我遇到了一个有趣的挑战/问题。 考虑一个业务规则引擎。它是一种应用程序,由运行业务规则所需的组件组成,然后将
我要监控的应用程序提供了一个用于健康检查的 api 端点,它以 json 格式响应指标。例如: $ curl https://example.com/api/stats {"status":"suc
因此,我正在将旧的数据可视化转换为新平台,但我对他们的社区排序功能有点困惑。在原始代码中,作者似乎使用了带有余弦相似度计算器的凝聚聚类。我认为在 Javascript 中解决这个问题的最佳方法是使用
我不是专业程序员,但我正在尝试改变一些技术指标在名为 TradeStation 的金融图表包中的显示方式(与特定图表供应商无关)。 这就是问题所在:大多数指标都是围绕零点绘制的,有时它们会靠近零点摆动
我们存储了大量来 self 们服务的指标(大约 8000 万个事件)。我们必须根据数据生成报告。 我的问题比较笼统,哪些工具可以满足您的指标/报告需求?有什么推荐的吗? 我们使用 Apache 编写日
我们网站上的页面的 CLS 一直接近于零。这是有道理的,因为它们是服务器呈现的 HTML 页面,具有简单的静态布局。 最近我们添加了 content-visibility: auto 的使用,如下所示
我能想到几种方法来转这种类型的矩阵(数据框): dat = data.frame( x1 = rep(c('a', 'b'), 100), x2 = rep(c('x', 'y
我正在使用 codahale 指标(现在是 dropwizard 指标)来监控我系统中发生的一些“事件”。我正在使用 counters跟踪“事件”发生次数的指标。 我检查了记者为我的计数器指标打印的值
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 11 个月前关闭。 Improve this que
在不使用 Heapster 的情况下,有没有办法收集有关 Kubernetes 集群中节点的 CPU 或磁盘指标? Heapster 最初是如何收集这些指标的? 最佳答案 Kubernetes 监控在
对于二元分类问题,我有一个略微不平衡的数据集,正负比为 0.6。 我最近从这个答案中了解到了 auc 指标:https://stats.stackexchange.com/a/132832/12822
为了做一些参数调整,我喜欢用 Keras 循环一些训练函数。但是,我意识到在使用 tensorflow.keras.metrics.AUC() 时作为度量,对于每个训练循环,都会将一个整数添加到 au
我使用 Azure,现在我想在特定情况下添加短信通知。 当我使用基于日志的指标时,它效果很好,但我想针对特定异常创建通知。 下一个流程:抛出异常 => Azure 知道识别它 => Azure 发送有
我正在尝试访问给定cloudService的指标 我有以下代码: var metricsClient = new MetricsClient(new CertificateCloudCredentia
我正在尝试使用 R 和 xgboost 来研究我的模型。训练模型总体上效果很好,但对于插入符来说,度量存在一些问题。 我尝试为类列设置一个因子,但仍然没有结果。 我的数据 ID var1var2TA
我对编程还很陌生,有时它会用非常基本的概念来困扰我。我在我的 tableviewcontroller 中定义了一个 Activity 指示器作为 Outlet。 @IBOutlet weak var
我正在训练一个进行序列预测的模型。例如,给定某人之前写过的 10 个单词,我正在训练 LSTM 来预测他们将写的下一个单词。我有一个有时可以工作的模型,因此我想创建一个指标来跟踪模型通过词性标签预测下
我正在尝试使用 hystrix 来监控某个网络调用。但我尝试监控的所有指标始终为空。我做错了什么? 我通过实现一个(某种程度上)RESTful 接口(interface)来模拟网络调用,该接口(int
我是一名优秀的程序员,十分优秀!