Iphone CTLine或NSAttributedString——在没有图形上下文的情况下获取图像边界?
这可能吗?基本上,我有一堆NSAttributedString对象和相应的CTLine对象。我想在drawRect阶段之前获得图像边界。因此,在这一点上,没有什么可以借鉴的。然后,我将使用这些图像边界来决定我需要为绘图创建什么 编辑:另一种尺寸测量方法可能会很好。但是调用貌似命名的CtlineGettyPrographicBounds函数只返回宽度。如果我输入上升和下降浮动的地址,它们返回为零Iphone CTLine或NSAttributedString——在没有图形上下文的情况下获取图像边界?,iphone,drawing,core-text,nsattributedstring,ctlineref,Iphone,Drawing,Core Text,Nsattributedstring,Ctlineref,这可能吗?基本上,我有一堆NSAttributedString对象和相应的CTLine对象。我想在drawRect阶段之前获得图像边界。因此,在这一点上,没有什么可以借鉴的。然后,我将使用这些图像边界来决定我需要为绘图创建什么 编辑:另一种尺寸测量方法可能会很好。但是调用貌似命名的CtlineGettyPrographicBounds函数只返回宽度。如果我输入上升和下降浮动的地址,它们返回为零 编辑:给出的答案在MacOS中非常有效。有人能在iOS中完成吗?是的,你可以,但不是那么容易 通常,您
编辑:给出的答案在MacOS中非常有效。有人能在iOS中完成吗?是的,你可以,但不是那么容易 通常,您应该使用CtlineGettyGraphicBounds(),对我来说,CtlineGettyGraphicBounds()确实返回上升、下降和前导,但有点混乱-“上升”等于总高度(即上升+下降),而“下降”始终是字体的最大下降-无论是否有下降字符 另一种方法是从行中检索CTRun(CTLineGetGlyphRuns),然后获取glyphs数组(CTRunGetGlyphs或CTRunGetGlyphsPtr),然后使用CtFontGetBoundingRects RGLYPHS和CTFontGetAdvancesForGlyphs构建所需的信息 编辑: 我刚刚找到了NSAttributedString的以下方法:“-(NSRect)boundingRectizewithSize:(NSSize)size选项:(NSStringDrawingOptions)options”,该方法似乎完全满足了需要
希望,这是有帮助的…是的,你可以,但不是那么容易 通常,您应该使用CtlineGettyGraphicBounds(),对我来说,CtlineGettyGraphicBounds()确实返回上升、下降和前导,但有点混乱-“上升”等于总高度(即上升+下降),而“下降”始终是字体的最大下降-无论是否有下降字符 另一种方法是从行中检索CTRun(CTLineGetGlyphRuns),然后获取glyphs数组(CTRunGetGlyphs或CTRunGetGlyphsPtr),然后使用CtFontGetBoundingRects RGLYPHS和CTFontGetAdvancesForGlyphs构建所需的信息 编辑: 我刚刚找到了NSAttributedString的以下方法:“-(NSRect)boundingRectizewithSize:(NSSize)size选项:(NSStringDrawingOptions)options”,该方法似乎完全满足了需要
希望,这会有所帮助。由
CtlineGettyPrographicBounds()
返回的边界与图像边界不同。顾名思义(以及他的答案),升序等是为字体定义的,不会根据字符串而改变。例如,如果要在有多行文字的情况下找到正确的行高,可以使用它,因为行高通常不应取决于所使用的确切字符
CTLineGetImageBounds()
另一方面,返回与图像完全匹配的边界。例如,如果您想围绕一条直线绘制一个方框,这就是您所需要的
CTLineGetImageBounds()
需要一个上下文,因为可能存在文本转换之类的内容。如果您不想担心这一点,只需使用虚拟上下文。例如:
CTLineRef line;
// create the line...
UIGraphicsBeginImageContext(CGSizeMake(1, 1));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetTextPosition(context, 0, 0);
CGRect bounds = CTLineGetImageBounds(line, context);
UIGraphicsEndImageContext();
// use bounds...
ctlineGettyPrographicBounds()
返回的边界与图像边界不同。顾名思义(以及他的答案),升序等是为字体定义的,不会根据字符串而改变。例如,如果要在有多行文字的情况下找到正确的行高,可以使用它,因为行高通常不应取决于所使用的确切字符
CTLineGetImageBounds()
另一方面,返回与图像完全匹配的边界。例如,如果您想围绕一条直线绘制一个方框,这就是您所需要的
CTLineGetImageBounds()
需要一个上下文,因为可能存在文本转换之类的内容。如果您不想担心这一点,只需使用虚拟上下文。例如:
CTLineRef line;
// create the line...
UIGraphicsBeginImageContext(CGSizeMake(1, 1));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetTextPosition(context, 0, 0);
CGRect bounds = CTLineGetImageBounds(line, context);
UIGraphicsEndImageContext();
// use bounds...
另一种方法是使用
CTFontGetGlyphsForCharacters()
将字符串转换为glyph,然后使用从第一个函数获得的glyph数组调用CTFontGetBoundingRectsForGlyphs()
。后一个函数返回“glyph运行的整体边界矩形”,因此不必担心必须对单个边界矩形进行处理。如果在iOS中成功使用这两个功能
如果这样做,请记住glyph和字符之间的映射并不总是一对一的,特别是当字符串包含非英语字符时。另一种方法是使用
CTFontGetGlyphsForCharacters()
将字符串转换为glyph,然后调用CTFontGetBoundingRectsForGlyphs()
使用从第一个函数获得的glyph数组。后一个函数返回“glyph运行的整体边界矩形”,因此不必担心必须对单个边界矩形进行处理。如果在iOS中成功使用这两个功能
如果这样做,请记住glyph和字符之间的映射并不总是一对一的,特别是当字符串包含非英语字符时。如果您是为iOS6+开发的。您可以使用以下方法:
CTLineRef line;
// Create the line...
CGRect bounds = CTLineGetBoundsWithOptions(line, kCTLineBoundsUseGlyphPathBounds);
// use bounds...
这与CTLineGetImageBounds()
提供的边界相同,前提是您没有在上下文中应用任何转换,但不需要上下文。对于iOS 5及以下版本,您需要使用
ctlineGettyPrographicBounds()
提供的宽度与此函数或图像边界不同。我不知道为什么。返回的上升和下降是字体的上升和下降,而不是显示在CTLineRef.
中的字符(如果您正在为iOS6+开发)。您可以使用以下方法:
CTLineRef line;
// Create the line...
CGRect bounds = CTLineGetBoundsWithOptions(line, kCTLineBoundsUseGlyphPathBounds);
// use bounds...
这与CTLineGetImageBounds()
提供的边界相同,前提是您没有在上下文中应用任何转换,但不需要上下文。对于iOS 5及以下版本,您将