Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CTLine或NSAttributedString——在没有图形上下文的情况下获取图像边界?_Iphone_Drawing_Core Text_Nsattributedstring_Ctlineref - Fatal编程技术网

Iphone CTLine或NSAttributedString——在没有图形上下文的情况下获取图像边界?

Iphone CTLine或NSAttributedString——在没有图形上下文的情况下获取图像边界?,iphone,drawing,core-text,nsattributedstring,ctlineref,Iphone,Drawing,Core Text,Nsattributedstring,Ctlineref,这可能吗?基本上,我有一堆NSAttributedString对象和相应的CTLine对象。我想在drawRect阶段之前获得图像边界。因此,在这一点上,没有什么可以借鉴的。然后,我将使用这些图像边界来决定我需要为绘图创建什么 编辑:另一种尺寸测量方法可能会很好。但是调用貌似命名的CtlineGettyPrographicBounds函数只返回宽度。如果我输入上升和下降浮动的地址,它们返回为零 编辑:给出的答案在MacOS中非常有效。有人能在iOS中完成吗?是的,你可以,但不是那么容易 通常,您

这可能吗?基本上,我有一堆NSAttributedString对象和相应的CTLine对象。我想在drawRect阶段之前获得图像边界。因此,在这一点上,没有什么可以借鉴的。然后,我将使用这些图像边界来决定我需要为绘图创建什么

编辑:另一种尺寸测量方法可能会很好。但是调用貌似命名的CtlineGettyPrographicBounds函数只返回宽度。如果我输入上升和下降浮动的地址,它们返回为零


编辑:给出的答案在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及以下版本,您将