2011-11-04 62 views
3

我有以下代码用CoreText格式化一段文本。段落与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一个无限循环进入。

我在做什么错了?


UPDATE:马蒂亚斯答案后,我想通了,该代码是没有问题的。在文本中间丢失了一些HTML标签(垃圾),出于某种原因,FrameSetter正在消失,返回并返回空的范围。当文字上没有HTML标签时,一切都很顺利。

回答

3

我怀疑CTParagraphStyleCreate返回NULL由于某种原因导致dictionaryWithObjectsAndKeys:创建一个空的字典。但是我看不到您的段落样式设置有任何错误。

看看我的CoreTextLabel.m使用段落样式设置的类源代码。

+0

谢谢,我会看到你的代码。我把一个断点和'CTParagraphStyleCreate'返回一个值,而不是NULL。 – javsmo

+0

我刚刚注意到,当我启用该行时,'CTFrameGetVisibleStringRange'返回'CTFrame:visible string range =(14058,0)'。这是一个空的范围,因为长度== 0.这导致无限循环,因为我将frame.length添加到textPosition以处理可见列。 – javsmo

+0

嗯好的。你能否让你的例子更完整? –