2011-07-15 4 views
12

Je prévoyais d'utiliser NSAttributedString pour mettre en évidence des parties de chaînes avec la requête correspondante de la recherche d'un utilisateur. Cependant, je ne peux pas trouver un équivalent iOS de NSBackgroundColorAttributeName -il n'y a pas de kCTBackgroundColorAttributeName. Est-ce qu'une telle chose existe, semblable à la façon dont NSForegroundColorAttributeName devient kCTForegroundColorAttributeName?Attribut NSBackgroundColorAttributeName dans NSAttributedString sur iOS?

+1

Voir si cela aide http://stackoverflow.com/questions/5424003/changing-background-color-on-nsattributedstring –

+0

Merci, malheureusement depuis NSAttributedString est mis en CoreText je don Je ne pense pas qu'il existe des vues pour lesquelles je peux changer la couleur de fond. – kevboh

+0

@kevboh J'ai écrit un HighlightLabel (http://github.com/dineshrajas/HighlightLabel). Allez-y, si vous voulez encore en avoir besoin. –

Répondre

8

Non, un tel attribut n'existe pas dans le texte principal, vous devrez dessiner vos propres rectangles sous le texte pour le simuler.

Fondamentalement, vous devrez déterminer quel rectangle (s) à remplir pour une plage donnée dans la chaîne. Si vous faites votre mise en page avec un CTFramesetter qui produit un CTFrame, vous devez obtenir ses lignes et leurs origines en utilisant CTFrameGetLines et CTFrameGetLineOrigins.

Ensuite, parcourez les lignes et utilisez CTLineGetStringRange pour déterminer les lignes qui font partie de la plage que vous souhaitez mettre en évidence. Pour obtenir les rectangles à remplir, utilisez CTLineGetTypographicBounds (pour la hauteur) et CTLineGetOffsetForStringIndex (pour le décalage horizontal et la largeur).

+2

Bonne réponse. C'est dommage qu'un attribut simple ne soit pas là pour remplacer tout ce code. – kevboh

+1

Mon projet DTCoreText prend en charge la mise en surbrillance de la même manière que sur Mac. Vous avez une méthode initWithHTMLData NSAttributedString pour obtenir le HTML de formulaire à la chaîne attribuée et une classe d'affichage qui affiche correctement les chaînes attribuées avec de nombreuses fonctionnalités supplémentaires sur CATextLayer. – Cocoanetics

4

NSBackgroundColorAttributeName est disponible dans iOS 6, et vous pouvez l'utiliser par ce qui suit:

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

[_attributedText drawInRect:rect]; 

drawInRect: soutiendra NSBackgroundColorAttributeName et tous les NS * NomsAttribut pris en charge par iOS 6.

Pour CTFrameDraw() il n'est pas pris en charge pour la couleur du texte d'arrière-plan.

code:

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

Génial, merci pour la mise à jour! – kevboh

Questions connexes