我正在尝试在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的问题)是我自己的错误.第一个问题仍然存在.
我正在为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文档真的很糟糕?
无论如何,谢谢你的帮助!
我正在开发一个我必须使用的iPad应用程序CTRunDelegate.我已经定义了所有所需的即回调CTRunDelegateGetAscentCallback,CTRunDelegateGetDescentCallback,CTRunDelegateGetWidthCallback.我不知道如何使用CTRunDelegateRef我正在创建的对象.现在发生的事情是我的回调没有被调用.
任何有关这方面的指示都将受到高度赞赏.
Thanx提前.
在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:视图中.此应用程序中没有多线程.
如何CGRect从NSRange使用Core Text呈现的文本中获取?
我正在使用Core Text NSAttributedString.
我正在处理仅从Resource加载TTF.这个问题帮助我回答了第1部分.但是现在我需要来自CGFont或CTFont的NSFont.
这适用于仅限Mac的应用程序.
我使用OpenType(.otf)格式的自定义字体,并希望使用该字体的一些OpenType功能.
如何使用UIKit或CoreText实现这一目标?我显然更喜欢UIKit,但是看看UIFont,选项非常有限.
似乎完全没有关于iOS上OpenType支持的文档,除了可以使用字体格式.
相关阅读:Microsoft 对OpenType功能的参考,以及有关浏览器如何开始提供OpenType功能支持的一些信息.虽然这个问题是在iOS上本地渲染具有OpenType功能的字体.
我试图找到内存泄漏的来源,详见此处:
当我使用乐器时,我可以看到有一种名为CG Raster Data的东西,其尺寸稳步增长,从未发布过.
有谁知道可能导致这种情况的原因以及如何补救?看起来这可能是某种图像缓存,但是可以从代码中清除它吗?
我想在iOS的形状的中心绘制文本,一个例子是微软办公的刀片形状看:https://www.dropbox.com/s/cgqyyuvy6hcv5g8/Screenshot%202014-01-21%2013.48.17巴纽
我有一个用于形成形状的坐标数组,可以很好地创建实际形状.
我的第一个策略是关注这个stackoverflow问题:在iOS上使用非对称形状的核心文本然而我只能在形状的底部绘制文本.有没有办法垂直和水平居中文本?
然后我看了一下新的TextKit,但是我不知道如何将NSTextContainer子类化为接受CGPath或坐标数组来创建要在其中绘制的文本容器.
我的备份解决方案是使用Core Text在形状的中心坐标处绘制文本,但这会导致文本在某些形状(如直角三角形)上绘制到形状之外.
或者,有没有其他方法可以用来在形状的中心稍微获得一些文字?
谢谢,
丹妮尔.
我正在寻找一种方法来获得角色的字形下降,如图所示:
该方法需要适用于任何给定字符(或至少所有常见的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}.这显然是不正确的.
如何直接为所有字符获取下降的粘合矩形?