- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,我使用 CoreText 来绘制文本突出显示。它工作得很好,除了当我尝试使用 CTLineGetStringRange 获取一行中的字符数时,它通常会给我一个比实际更大的数字。例如,在包含 156 个字符的行中,范围长度为 164。CTLineGetGlyphCount
返回相同的数字。
有人知道为什么会发生这种情况吗?我用来创建框架 setter 的 NSAttributedString 使用与我的 UITextView 完全相同的字体。
这是我的代码:
// Build the attributed string from our text data and string attribute data
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.text attributes:self.attributes];
// Create the Core Text framesetter using the attributed string
_framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attributedString);
// Create the Core Text frame using our current view rect bounds
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];
_frame = CTFramesetterCreateFrame(_framesetter, CFRangeMake(0, 0), path.CGPath, NULL);
NSArray *lines = (__bridge NSArray *) CTFrameGetLines(_frame);
for (int i = 0; i < lines.count; i++) {
CTLineRef line = (__bridge CTLineRef) [lines objectAtIndex:i];
CFRange lineRange = CTLineGetStringRange(line);
NSLog(@"lineRange: %ld, %ld", lineRange.location, lineRange.length);
CFIndex glyphCount = CTLineGetGlyphCount(line);
NSLog(@"glyphCount: %ld", glyphCount);
}
我的类是 UIView
的子类,它作为 subview 添加到 UITextView
子类的实例中。
编辑:这是我正在测试的示例字符串:
textView.text = @"Marvel's The Avengers is a 2012 American superhero film produced by Marvel Studios and distributed by Walt Disney Pictures, based on the Marvel Comics superhero team of the same name.";
在这种情况下,第一行包含
《漫威复仇者联盟》是一部 2012 年美国 super 英雄电影,由漫威影业制作、华特迪士尼影业发行,改编自全长 137 个字符的《复仇者联盟》。但它给了我一个长度为 144 的线的范围。
但是,当我尝试使用以下文本时,结果有所不同:
textView.text = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
现在第一行包含
“Lorem ipsum dolor sat amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut Labore et dolore magna aliqua.Ut enim ad minim”,长度为 142。但这里它给了我长度为 142 的正确范围。
然后我尝试了更多文本:
文字:“阿斯加德洛基遇到了异者,一个被称为奇塔瑞的外星种族的领导者。作为取回宇宙立方(一种潜力未知的强大能源)的交换条件,异者向洛基 promise 一支奇塔瑞军队,他可以用它征服地球。”
结果:“阿斯加德洛基遇到了另一个人,一个被称为 Chitauri 的外星种族的领导者。作为交换,取回了长度为 145 的强大的宇宙立方。
线路范围长度: 145
文字:“斯塔克和罗杰斯意识到,对于洛基来说,仅仅击败他们是不够的;他需要公开压制他们,以证明自己是地球的统治者。”
结果:“斯塔克和罗杰斯意识到,对于洛基来说,仅仅击败他们是不够的;他需要公开击败他们,以证明自己是统治者”,长度为 146。
线路范围长度:149
正如您所见,有时它是正确的,有时则不是。我找不到解释。
最佳答案
我根据this answer中给出的提示解决了问题.
看起来,因为 UITextView
继承自 UIScrollView
,所以它在每个边缘都有一个 8 像素的插入。这意味着我的内部 UIView
的文本空间比我的 UITextView
宽 16 像素,有时这种差异意味着它可以在换行之前再容纳一个单词,这给出了该行中错误的字符数。
因此,从 View 宽度中减去 16 像素解决了我的问题。
但是,这只是我解决方案的一部分。另一部分是从核心文本中我的属性字符串中删除字偶距和连字:
CFAttributedStringSetAttribute(string, textRange, kCTKernAttributeName, (__bridge CFTypeRef)([NSNumber numberWithFloat:0.0]));
CFAttributedStringSetAttribute(string, textRange, kCTLigatureAttributeName, (__bridge CFTypeRef)([NSNumber numberWithInt:0]));
现在线条完美契合。
关于objective-c - CTLineGetStringRange 和 CTLineGetGlyphCount 返回的行中字符数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997220/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!