ios - CTFrameGetLineOrigins 返回 Y 坐标

标签 ios objective-c core-text ctframe

所有 x 坐标都是正确的,但所有 y 坐标都不正确 - 总是 3.40282e+38。 如何为每个 CTLine 获取正确的 y

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self.attString);

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0, 0, self.frameSize.width, CGFLOAT_MAX));
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, self.attString.length), path, NULL);
CFArrayRef lines = CTFrameGetLines(frame);
size_t numOfLines = CFArrayGetCount(lines);
CGPoint lineOrigins[numOfLines];
CTFrameGetLineOrigins(frame, CFRangeMake(0, numOfLines), lineOrigins);

NSLog(@"Lines count %ld", numOfLines);
for (CFIndex i = 0; i < numOfLines; i++)
{
    CTLineRef line = CFArrayGetValueAtIndex(lines, i);
    [self draw:frame line:line];

    NSLog(@"%@", NSStringFromCGPoint(lineOrigins[i]));
}

输出:

2014-04-11 10:45:27.095 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.099 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.105 Backgammon HD Narde[2221:707] {84.997, 3.40282e+38}
2014-04-11 10:45:27.111 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.117 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.121 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.124 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.126 Backgammon HD Narde[2221:707] {0, 3.40282e+38}
2014-04-11 10:45:27.128 Backgammon HD Narde[2221:707] {136.804, 3.40282e+38}
2014-04-11 10:45:27.132 Backgammon HD Narde[2221:707] {0, 3.40282e+38}

最佳答案

您获得了正确的坐标,但 CoreText 原点是“左下角”,并且当您通过使用 CGFLOAT_MAX 使用巨大的高度时,您看不到它们。 使用较小高度 (1e7) 并显示基线和翻转线坐标的示例代码(基于您的代码)。

 NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit amet, ..."];

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);

CGMutablePathRef path = CGPathCreateMutable();
// used a smaller height
CGPathAddRect(path, NULL, CGRectMake(0, 0, self.view.frame.size.width, 1e7));
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
CFArrayRef lines = CTFrameGetLines(frame);
size_t numOfLines = CFArrayGetCount(lines);
CGPoint lineOrigins[numOfLines];
CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), lineOrigins);

// transform to flip coordinate
CGAffineTransform transform = CGAffineTransformMakeTranslation(0, 1e7);
transform = CGAffineTransformScale(transform, 1, -1);

NSLog(@"Lines count %ld", numOfLines);
for (CFIndex i = 0; i < numOfLines; i++)
{
    CGPoint flipped; // flipped line location
    flipped = CGPointApplyAffineTransform(lineOrigins[i], transform);

    NSLog(@"origin=%@ flipped=%@", NSStringFromCGPoint(lineOrigins[i]), NSStringFromCGPoint(flipped));
}

日志输出:

Lines count 8
origin={0, 9.99999e+06} flipped={0, 12}
origin={0, 9.99997e+06} flipped={0, 27}
origin={0, 9.99996e+06} flipped={0, 42}
origin={0, 9.99994e+06} flipped={0, 57}
origin={0, 9.99993e+06} flipped={0, 72}
origin={0, 9.99991e+06} flipped={0, 87}
origin={0, 9.9999e+06} flipped={0, 102}
origin={0, 9.99988e+06} flipped={0, 117}

关于ios - CTFrameGetLineOrigins 返回 Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23006959/

相关文章:

ios - Objective c - 句子验证正则表达式

iphone - 生成当月的随机日期

ios - 当我的 iOS 应用程序将数据发送到服务器(POST,GET)时如何处理表情符号

ios - 如何使用 PFQuery 查询与数组的精确匹配?

iphone - 编辑后将实体保存在核心数据中

ios - 附加文本时,由 NSTextStorage 支持的 UITextView 未更新

ios - 如何在 IOS13 中找到这个与字体相关的 coretext 警告的来源?

nsattributedstring - 核心文本 - NSAttributedString 行高做得对吗?

ios - 如何在 Swift 中从本地视频 url 获取预览图像

ios - 设置带边距的 UIButton 最小字体大小