标签: core-text

在Core Text中查找文本的边界rect

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

line = CTLineCreateWithAttributedString(attrString);
rect = CTLineGetImageBounds(line, context);
Run Code Online (Sandbox Code Playgroud)

它大部分时间都有效,但对于某些字符,如数学斜体d(Unicode:0x1D451)或数学斜体q(Unicode:0x1D45E),宽度有点短.

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

我尝试直接访问字形并使用CTFontCreatePathForGlyph(),但由于CGGlyph和UniChar都是16位而且我需要32位字符而失败.

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

更新:

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

更新:

忽略我以前的更新!原来这个(Arial Italic的问题)是我自己的错误.第一个问题仍然存在.

macos cocoa cocoa-touch core-text

7
推荐指数
1
解决办法
2514
查看次数

在iPad上呈现长文档

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

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

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

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

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

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

不是太寒酸.

主要问题是它是SLOOOOOOOW.滚动浏览文档非常快捷,但动态更改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文档真的很糟糕?

无论如何,谢谢你的帮助!

iphone objective-c ipad core-text

7
推荐指数
1
解决办法
2510
查看次数

如何在iPad中使用CTRunDelegate?

我正在开发一个我必须使用的iPad应用程序CTRunDelegate.我已经定义了所有所需的即回调CTRunDelegateGetAscentCallback,CTRunDelegateGetDescentCallback,CTRunDelegateGetWidthCallback.我不知道如何使用CTRunDelegateRef我正在创建的对象.现在发生的事情是我的回调没有被调用.

任何有关这方面的指示都将受到高度赞赏.

Thanx提前.

ipad core-text ios

7
推荐指数
1
解决办法
3572
查看次数

为什么这是CTFrame的过度释放

在iOS上使用一些CoreText代码,我很困惑为什么这是CTFrame的过度发布.我已经确认它是一个过度释放但我感到困惑,因为它是用一种create方法创建的.

for (NSValue *value in [self frameArray]) {
  CGRect column = [value CGRectValue];
  CGMutablePathRef path = CGPathCreateMutable();
  CGPathAddRect(path, NULL, column);
  CTFrameRef frame = CTFramesetterCreateFrame(bodyFramesetter, CFRangeMake(position, 0), path, NULL);
  CTFrameDraw(frame, context);
  position += CTFrameGetVisibleStringRange(frame).length;
  CGPathRelease(path);
  // ???: Why does this cause an overrelease?
  //CFRelease(frame);
}
Run Code Online (Sandbox Code Playgroud)

更新

代码库是3.2,并且第一个版本不会发生崩溃.在绘制视图时,它会在某个时刻"随机"出现.这个循环,你可能猜到的是在-drawRect:视图中.此应用程序中没有多线程.

objective-c core-text

7
推荐指数
1
解决办法
1264
查看次数

核心文本 - 从NSRange获取像素坐标

如何CGRectNSRange使用Core Text呈现的文本中获取?

我正在使用Core Text NSAttributedString.

iphone objective-c core-text

7
推荐指数
1
解决办法
2642
查看次数

如何从CGFont或CTFont对象获取NSFont对象?

我正在处理仅从Resource加载TTF.这个问题帮助我回答了第1部分.但是现在我需要来自CGFont或CTFont的NSFont.

这适用于仅限Mac的应用程序.

cocoa core-text

7
推荐指数
1
解决办法
3151
查看次数

访问UIKit或CoreText中的OpenType功能

我使用OpenType(.otf)格式的自定义字体,并希望使用该字体的一些OpenType功能.

如何使用UIKit或CoreText实现这一目标?我显然更喜欢UIKit,但是看看UIFont,选项非常有限.

似乎完全没有关于iOS上OpenType支持的文档,除了可以使用字体格式.

相关阅读:Microsoft 对OpenType功能参考,以及有关浏览器如何开始提供OpenType功能支持的一些信息.虽然这个问题是在iOS上本地渲染具有OpenType功能的字体.

uikit core-text ios

7
推荐指数
1
解决办法
1288
查看次数

CG栅格数据 - CGProviderCreateWithCopyOfData - 无法释放?

我试图找到内存泄漏的来源,详见此处:

无法发布Quartz 2D和Core Text创建的图像

当我使用乐器时,我可以看到有一种名为CG Raster Data的东西,其尺寸稳步增长,从未发布过.

有谁知道可能导致这种情况的原因以及如何补救?看起来这可能是某种图像缓存,但是可以从代码中清除它吗?

objective-c quartz-2d core-text ios automatic-ref-counting

7
推荐指数
1
解决办法
877
查看次数

iOS在形状中心绘制文本

我想在iOS的形状的中心绘制文本,一个例子是微软办公的刀片形状看:https://www.dropbox.com/s/cgqyyuvy6hcv5g8/Screenshot%202014-01-21%2013.48.17巴纽

我有一个用于形成形状的坐标数组,可以很好地创建实际形状.

我的第一个策略是关注这个stackoverflow问题:在iOS上使用非对称形状的核心文本然而我只能在形状的底部绘制文本.有没有办法垂直和水平居中文本?

然后我看了一下新的TextKit,但是我不知道如何将NSTextContainer子类化为接受CGPath或坐标数组来创建要在其中绘制的文本容器.

我的备份解决方案是使用Core Text在形状的中心坐标处绘制文本,但这会导致文本在某些形状(如直角三角形)上绘制到形状之外.

或者,有没有其他方法可以用来在形状的中心稍微获得一些文字?

谢谢,

丹妮尔.

core-graphics core-text ios textkit

7
推荐指数
3
解决办法
7568
查看次数

获取除字母或数字之外的字符CGGlyphs的边界矩形

我正在寻找一种方法来获得角色的字形下降,如图所示:

在此输入图像描述

该方法需要适用于任何给定字符(或至少所有常见的unicode字符).

这是我的实际方法(在Swift中,灵感来自于这个这个问题):

let char = "a"
let ctFont = CTFontCreateWithNameAndOptions("HelveticaNeue", 12, nil, nil)
var ctGlyph = CTFontGetGlyphWithName(ctFont, char)
let boundingBox = withUnsafePointer(&ctGlyph) { pointer -> CGRect in
    return CTFontGetBoundingRectsForGlyphs(ctFont, CTFontOrientation.OrientationDefault, pointer, nil, 1)
}
Run Code Online (Sandbox Code Playgroud)

我需要的下降就等于-boundingBox.origin.y.这种方法适用于字母,数字和数字字符(请参阅此答案以获取图形表示).

问题是,对于除字母或数字之外的所有内容(例如.,#')*:),我得到相同的边界矩形:{x:0.612, y:0.012, w:4.908, h:8.532}.这显然是不正确的.

如何直接为所有字符获取下降的粘合矩形?

string core-text ios swift

7
推荐指数
0
解决办法
1077
查看次数