2011-07-15 10 views
12

NSAttributedStringを使用して、ユーザーの検索の一致するクエリで文字列の一部をハイライトすることを計画していました。しかし、NSBackgroundColorAttributeNameのiOSに相当するものは見つかりません。kCTBackgroundColorAttributeNameはありません。このようなことは、のように存在しますか?kCTForegroundColorAttributeNameiOSのNSAttributedStringのNSBackgroundColorAttributeNameのような属性ですか?

+1

これはNSAttributedStringがCoreText Iドンにレイアウトされ、残念ながらので、http://stackoverflow.com/questions/5424003/changing-background-color-on-nsattributedstring –

+0

おかげで、場合に役立ちます参照してください。私が背景色を変えることができるビューがあるとは思わない。 – kevboh

+0

@kevboh私はHighlightLabel(http://github.com/dineshrajas/HighlightLabel)を書いています。あなたがまだそれを必要としたい場合は、先に進んでください。 –

答えて

8

このような属性はコアテキストには存在しません。テキストの下に独自の矩形を描いてシミュレーションする必要があります。

基本的には、文字列内の特定の範囲を満たす矩形を特定する必要があります。 CTFramesetterCTFrameというレイアウトを使用する場合は、その行とその起点をCTFrameGetLinesCTFrameGetLineOriginsで取得する必要があります。

次に、行全体を繰り返し、CTLineGetStringRangeを使用して、ハイライトしたい範囲に含まれる行を見つけます。長方形を塗りつぶすには、CTLineGetTypographicBounds(高さの場合)とCTLineGetOffsetForStringIndex(横のオフセットと幅の場合)を使用します。

+2

素晴らしい答え。シンプルな属性は、すべてのコードを置き換えることではありません。 – kevboh

+1

私のDTCoreTextプロジェクトは、Mac上で動作するのと同じ方法で強調表示をサポートしています。フォームHTMLを属性付き文字列に変換するNSAttributedString initWithHTMLDataメソッドと、CATextLayerよりも多くの追加機能を持つ属性付き文字列を適切に表示するビュークラスがあります。 – Cocoanetics

4

NSBackgroundColorAttributeNameは、iOS 6で利用可能です、あなたは以下の方法でそれを使用することができます:* CTFrameDrawのためのiOS 6

でサポートされているAttributeNames()が

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

[_attributedText drawInRect:rect]; 

drawInRect:がNSBackgroundColorAttributeName、すべてのNSをサポートします背景テキストの色をサポートしていません。

コード:

- (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

関連する問題