问题标签 [core-text]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
22405 浏览

ios - iOS:如何使用 Quartz 测量字符串的宽度和高度?

在我提出问题之前,这是来自 Apple 的文档 re:how to determine the width of a string of using Quartz:

如果文本测量对您的应用很重要,则可以使用 Quartz 2D 函数来计算它们。但是,您可能首先考虑使用 ATSUI,它的优势在于文本布局和测量。ATSUI 有几个获取文本度量的函数。您不仅可以获得布局后文本指标,而且在极少数需要它们的情况下,您可以获得布局前文本指标。与您必须自己执行计算的 Quartz 不同,ATSUI 会为您计算测量值。例如,您可以通过调用 ATSUI 函数 ATSUMeasureTextImage 来获取文本的图像边界矩形。

如果您认为 Quartz 文本比 ATSUI(或 Cocoa)更适合您的需求,您可以按照以下步骤在 Quartz 绘制文本之前测量文本的宽度:

  1. 调用函数 CGContextGetTextPosition 获取当前文本位置。
  2. 使用函数 CGContextSetTextDrawingMode 将文本绘制模式设置为 kCGTextInvisible。
  3. 通过调用函数CGContextShowText来绘制文本,在当前文本位置绘制文本。
  4. 通过调用函数 CGContextGetTextPosition 确定最终文本位置。
  5. 从结束位置减去开始位置以确定文本的宽度。

以下是我的问题:

  1. 这真的是使用 Core Graphics 确定字符串宽度的最佳方法吗?它看起来很脆弱,因为我的文本与 2D 图形元素共存,所以我想对所有渲染使用相同的上下文。我希望会有一些紧凑的方法,比如:

    /li>
  2. 我读到 ATSUI 已经过时,将被 Core Text 取代。这是真的吗?如果是这样,是在 iOS 中吗?

0 投票
2 回答
11842 浏览

iphone - 绘制下划线/删除线文本(多行字符串)?

我必须使用所有类型的文本对齐来绘制带下划线的多行文本。我在论坛上搜索并得到了一些结果,例如:

http://davidjhinson.wordpress.com/2009/11/26/underline-text-on-the-iphone/

http://forums.macrumors.com/showthread.php?t=561572

但所有仅绘制单行文本。虽然我有多行文字。当文本对齐居中时,情况会变得更糟。我搜索并发现在 iphone-sdk-3.2 中有一些核心文本属性用于为文本加下划线,但不知道如何使用它。此外,如果我使用这些,我的问题将无法完全解决。

因为我还必须绘制删除线文本。

任何对此有想法的人请帮忙。

0 投票
4 回答
6168 浏览

cocoa - 如何使用 Core Text 从文件中加载字体 (TTF)?

在 OSX 10.6 之前,ATSFontActivateFromFileSpecification/ATSFontActivateFromFileReference 可用,可用于从文件加载字体。我在核心文本中找不到类似的东西。

0 投票
6 回答
11734 浏览

cocoa - Core Text 的 CTFramesetterSuggestFrameSizeWithConstraints() 每次都返回不正确的大小

根据文档,CTFramesetterSuggestFrameSizeWithConstraints ()“确定字符串范围所需的帧大小”。

不幸的是,此函数返回的大小永远不会准确。这是我正在做的事情:

返回的尺寸总是计算出正确的宽度,但是高度总是比预期的略短。

这是使用此方法的正确方法吗?

有没有其他方法来布局核心文本?

似乎我不是唯一遇到这种方法问题的人。请参阅https://devforums.apple.com/message/181450

编辑:我使用 Quartz 测量了相同的字符串sizeWithFont:,为属性字符串和 Quartz 提供相同的字体。以下是我收到的测量结果:

核心文本:133.569336 x 16.592285

石英:135.000000 x 31.000000

0 投票
2 回答
2589 浏览

cocoa - 在 Core Text 中查找文本的边界矩形

我试图在核心文本中找到一行文本的边界。为简单起见,假设它只有一个字符。目前我正在使用以下方法:

它在大多数情况下都有效,但对于某些字符,例如数学斜体 d(Unicode:0x1D451)或数学斜体 q(Unicode:0x1D45E),宽度有点短。

我尝试使用CTLineGetTypographicBounds()or CTFramesetterSuggestFrameSizeWithConstraints,但它们也没有帮助(我认为他们使用字形的 Advance 来查找宽度,而不是其图形宽度。)由于字体本身不是斜体,我也不能使用倾斜角度来纠正这个.

我尝试直接访问字形并使用CTFontCreatePathForGlyph(),但失败了,因为 CGGlyph 和 UniChar 都是 16 位,我需要 32 位字符。

有谁知道我做错了什么?如果是这样,正确的方法是什么?

更新:

为了确保它不是与字体相关的问题,我使用了不同的字体。甚至 Arial Italic 中的 ASCII 字符也存在问题。

更新:

忽略我之前的更新!事实证明,这个(Arial Italic 的问题)是我自己的错误。第一个问题仍然存在。

0 投票
1 回答
850 浏览

iphone - CoreText:行间距

我怎么知道两条线之间的大小是多少?我正在使用 CoreText API。

0 投票
1 回答
628 浏览

iphone - iPhone OS 语法高亮 UITextField

我正在开发一个应用程序,并希望将语法突出显示应用于某些用户输入的文本。我环顾四周,有些人建议这可以在 iOS 3.2+ 中完成,但帖子似乎来自 NDA 取消之前。有没有人对如何去做这件事有任何建议?

如果我能很好地实现它,我会对在 github 上发布代码感兴趣,因为我以前从未这样做过。

谢谢

0 投票
2 回答
2014 浏览

fonts - OpenType Font Parsing for Pleasure and Profit(有人了解这些愚蠢的表格吗?)

所以,这主要是为了好玩,我正在四处寻找并试图在几种字体中找到我的方式,我有几个问题如果有人做过这种事情,我真的很感激一些帮助。

映射表

我正在测试的字体包含几个不同格式的 cmap 子表。我可以阅读它们,但我不明白我应该使用哪个。IE。选择最合适的子表的策略是什么?这甚至有意义吗?

字形表

这真是让我头疼。我要看看这里有什么。查看该页面上的第二个表格,我有 'n' endPtsOfContours、'n' 指令和 'n' 标志,但我不清楚我是否有与轮廓相同数量的标志(我知道有多少轮廓我有)。然后,更糟糕的是......(有趣!)我有一个 xCoords 数组和一个 yCoords 数组。这些数组的长度似乎不确定,可能包含 BYTE 或 SHORT 数据,但我们不会告诉你是哪一个。

好的,我想这就是指令和标志的用途,但是您可能会说我真的不知道如何处理它们。我需要 TrueType 解释器来访问坐标数据吗?

0 投票
4 回答
2523 浏览

iphone - 在 iPad 上渲染长文档

我正在为 iPad 上的自定义文档格式实现具有突出显示/注释功能的文档查看器。这些文件有点长(100 到 200 页,如果打印在纸上),我很难找到正确的方法。以下是要求:

1) 基本的富文本样式:控制左右边距。控制字体名称、大小、前景色/背景色和行距。粗体、斜体、下划线等。

2) 任意文本区域的选择和突出显示(不限于段落边界,如在 Safari/UIWebView 中)。

3)自定义剪切/复制/粘贴弹出窗口(UIMenuController)这是应用程序的基本要求之一。

我的第一个实现是基于 UIWebView。我只是将文档呈现为带有 CSS 的 HTML 以进行文本样式设置。但是我无法获得我想要的那种文本选择行为(跨段落边界),并且无法从 UIWebView 中自定义 UIMenuController。

所以我开始研究一种 javascript 方法,使用 JQuery 伪造设备文本选择行为以捕获触摸事件并动态修改 DOM 以更改所选文本区域的背景颜色。我构建了一个假的 UIMenuController 控件作为隐藏的 DIV,只要有一个活动的选择区域,就可以定位它并取消隐藏它。

不是太寒酸。

主要问题是它很慢。滚动浏览文档既好又快,但动态更改 DOM 并不是很灵活。另外,我不知道如何重新创建放大镜,所以我的假文本选择 GUI 看起来与本机实现不太一样。此外,我还没有实现 javascript 层和 Objective-c 层(应用程序的其余部分所在的层)之间的通信桥,但它正在形成一个巨大的麻烦。

所以我一直在看CoreText,但网络上的例子很少。我花了一点时间在这个简单的小演示上:

http://github.com/jonasschnelli/I7CoreTextExample/

它展示了如何使用 CoreText 将 NSAttributedText 字符串绘制到 UIView 中。但它有自己的问题:它没有实现文本选择行为,也没有提供 UIMenuController,所以我不知道如何实现这一点。而且,更重要的是,它试图一次绘制整个文档,长文档的性能会显着下降。我的文档可以有数千个段落,而且每次只有不到 1% 的文档出现在屏幕上。

从好的方面来说,这些文档已经包含精确的格式信息。我知道每一行文本的确切页面位置,所以我不需要布局引擎。

有谁知道如何使用 CoreText 实现这种视图?我知道对于这样的问题来说,一个完整的实现是矫枉过正的,但我正在寻找一个具有一些基本要求的优秀 CoreText 示例:

1)精确的布局和格式控制(使用我已经计算过的格式指标和文本样式)。

2) 任意选择文本。

3) UIMenuController 的自定义。

4) 屏幕外对象资源的有效回收。

当文本元素滚动到屏幕外时,我很乐意实现自己的回收,但这不需要重新实现 UIScrollView 吗?

我是 iPhone 开发的新手,还在习惯 Objective-C,但是我已经使用其他语言(Java、C#、flex/actionscript 等)工作了十多年,所以我对如果我对 iPhone SDK 和此类东西的常见编码模式有更好的感觉,我就有能力完成工作。只是我,还是 SDK 文档真的很烂?

不管怎样,谢谢你的帮助!

0 投票
3 回答
957 浏览

iphone - 核心文本:计算后台线程中的页数

假设我正在使用 Core Text 为 iPhone 编写文本查看器。每次用户更改基本字体大小时,我都需要计算显示具有给定字体大小的整个 NSAttributedString 需要多少页(固定大小的 CGRects)。

而且我想在单独的 NSOperation 中执行此操作,以便用户不会遇到不必要的 UI 滞后。

不幸的是,要计算页数,我需要使用不可见文本绘图模式绘制我的框架 (CTFrameDraw),然后使用 CTFrameGetVisibleStringRange 来计算字符数。但是要绘制文本,我需要一个 CGContext。问题从这里开始......

我可以通过调用 UIGraphicsGetCurrentContext 在 drawRect 中获取 CGContext,但在这种情况下:

  1. 我必须使用 performSelectorOnMainThread 调用对 CGContext 进行操作的任何方法,对吗?
  2. 另一个线程应该 CFRetain 这个上下文。在drawRect方法之外使用drawRect的CGContext是否可以接受?

还有其他解决方案吗?在工作线程中创建单独的 CGContext?如何?CGBitmap上下文?我如何确定所有条件(我不知道,分辨率?等)都与 drawRect 的 CGContext 中的相同,以便正确计算页面?