我有以下代码用CoreText格式化一段文本。
(...)
CTFontRef fontRef = CTFontCreateWithName((CFStringRef)fontName,
[self.fontSize floatValue], NULL);
CTTextAlignment alignment = kCTJustifiedTextAlignment;
CTParagraphStyleSetting settings[]={
{kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment},
};
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings,
sizeof(settings)/sizeof(settings[0]));
self.attrs = [NSDictionary dictionaryWithObjectsAndKeys:
//The following line doesn't work!
(id)paragraphStyle, kCTParagraphStyleAttributeName,
(id)self.color.CGColor, kCTForegroundColorAttributeName,
(id)fontRef, kCTFontAttributeName,
nil];
CFRelease(fontRef);
CFRelease(paragraphStyle);
NSMutableAttributedString* aString = [[[NSMutableAttributedString alloc] initWithString:@""] autorelease];
(...)
[aString appendAttributedString:[[[NSAttributedString alloc] initWithString:text attributes:attrs] autorelease]];
如果删除以下属性对(值/键),一切正常(颜色,字体等)。
(id)paragraphStyle, (NSString*)kCTParagraphStyleAttributeName,
如果我将此属性放在attrs字典上,当我使用CTFrameGetVisibleStringRange时,程序会进入无限循环。
我做错了什么?
更新:在Mattias回答之后我发现代码不是问题。在文本中间丢失了一些HTML标签(垃圾),由于某种原因,FrameSetter丢失并返回并且空范围。当文本上没有HTML标签时,一切都很顺利。
答案 0 :(得分:3)
我怀疑CTParagraphStyleCreate
因某种原因返回NULL
导致dictionaryWithObjectsAndKeys:
创建一个空字典。但我看不到你的段落样式设置有任何错误。
查看我使用段落样式设置的CoreTextLabel.m
类来源。