在CoreText中,很容易问:“给定的矩形有多少这个归因的字符串将适合?”
CTFrameGetVisibleStringRange(rect).length
将返回字符串中的下一个文本应该开始的位置.
我的问题是:“给定一个归因的字符串和一个宽度,我需要什么rect height来完全绑定归因的字符串?”
CoreText框架是否提供了这样的工具?
谢谢,
道格
解决方法
你需要的是
CTFramesetterSuggestFrameSizeWithConstraints()
,你可以这样使用它:
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attributedString)); /*Create your framesetter based in you NSAttrinbutedString*/ CGFloat widthConstraint = 500; // Your width constraint,using 500 as an example CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints( framesetter,/* Framesetter */ CFRangeMake(0,text.length),/* String range (entire string) */ NULL,/* Frame attributes */ CGSizeMake(widthConstraint,CGFLOAT_MAX),/* Constraints (CGFLOAT_MAX indicates unconstrained) */ NULL /* Gives the range of string that fits into the constraints,doesn't matter in your situation */ ); CGFloat suggestedHeight = suggestedSize.height;
编辑
//IMPORTANT: Release the framesetter,even with ARC enabled! CFRelease(frameSetter);
As ARC releases only Objective-C objects和CoreText处理C,很有可能在这里有一个内存泄漏.如果你的NSAttributedString很小,你做了一次,你不应该有任何不良后果.但是在一个例子中,你有一个循环可以计算出来,大概/复杂的NSAttributedStrings的高度是50个高度,你不会释放CTFramesetterRef,你可以有严重的内存泄漏.检查链接的教程,了解有关内存泄漏和仪器调试的更多信息.