2011-07-15 36 views
12

我打算使用NSAttributedString來使用匹配的用戶搜索查詢來突出部分字符串。但是,我找不到相當於NSBackgroundColorAttributeName的iOS版本 - 沒有kCTBackgroundColorAttributeName。這樣的事情是否存在,類似於NSForegroundColorAttributeName變爲kCTForegroundColorAttributeNameiOS中的NSAttributedString中NSBackgroundColorAttributeName類似的屬性?

+1

看看這有助於http://stackoverflow.com/questions/5424003/changing-background-color-on-nsattributedstring –

+0

感謝,可惜因爲NSAttributedString在CoreText我不佈局我不認爲有什麼我可以改變背景顏色的意見。 – kevboh

+0

@kevboh我寫了一個HighlightLabel(http://github.com/dineshrajas/HighlightLabel)。繼續,如果你還想要它。 –

回答

8

不,核心文本中不存在這樣的屬性,您必須在文本下方繪製自己的矩形來模擬它。

基本上,你必須找出填充字符串中給定範圍的矩形(s)。如果您使用產生CTFrameCTFramesetter進行佈局,則需要使用CTFrameGetLinesCTFrameGetLineOrigins來獲得其行和源。

然後迭代線條並使用CTLineGetStringRange來找出哪些線條是要突出顯示的範圍的一部分。要獲取矩形填充,請使用CTLineGetTypographicBounds(對於高度)和CTLineGetOffsetForStringIndex(對於水平偏移和寬度)。

+2

很好的答案。這是一個恥辱一個簡單的屬性是不是要取代所有的代碼。 – kevboh

+1

我的DTCoreText項目支持突出顯示它在Mac上的相同方式。你有一個NSAttributedString的initWithHTMLData方法來獲取表單HTML到歸屬字符串,以及一個視圖類,它可以正確顯示帶有CATextLayer上許多附加功能的屬性字符串。 – Cocoanetics

4

NSBackgroundColorAttributeName在iOS 6中可用,您可以通過以下方式來使用它:

[_attributedText addAttribute: NSBackgroundColorAttributeName value:[UIColor yellowColor] range:textRange]; 

[_attributedText drawInRect:rect]; 

drawInRect:將支持NSBackgroundColorAttributeName和所有的NS *通過的iOS 6

支持CTFrameDraw AttributeNames()有不支持背景文字顏色。

代碼:

- (void)drawRect:(CGRect)rect {  

    // First draw selection/marked text, then draw text 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    [_attributedText drawInRect:rect]; 

    CGContextRestoreGState(context); 

// CTFrameDraw(_frame, UIGraphicsGetCurrentContext()); 

} 
+0

真棒,感謝您的更新! – kevboh

相關問題