10

Ho un UITextView e ci sono determinate parole che sto lanciando con NSString stringWithFormat che mi piacerebbe essere in grassetto.Come mettere in grassetto alcune parole nel mio UITextView usando NSMutableAttributedString?

Mi sono guardato attorno a Stack Overflow e ho cercato di seguire i post ma credo di non capirlo.

Ecco quello che ho giocato in giro con:

NSRange boldedRange = NSMakeRange(0, 4); 
    NSString *boldFontName = [[UIFont fontWithName:@"Helvetica-Bold" size:100]fontName]; 


    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:self.name]; 

    [attrString beginEditing]; 
    [attrString addAttribute:NSFontAttributeName 
         value:boldFontName 
         range:boldedRange]; 
    [attrString endEditing]; 

    self.resultsTextView.attributedText = attrString; 


    self.resultsTextView.text = [NSString stringWithFormat:@"One day, %@ was taking a walk and saw a %@ boy. He was %@ a %@.", attrString, self.adjective, self.adverb, self.noun]; 
+1

Stato un po 'da quando ho lavorato con le stringhe attribuite, ma a me sembra che il tuo problema è che stai impostando 'resultsTextView' da attribuire stringa, ma nella riga successiva lo imposti come' NSString' non attribuito. 'NSString' non ha attributi, quindi in pratica stai" annullando "qualsiasi attributo che hai" fatto ". Se non ricordo male, non puoi avere entrambe le proprietà 'attributeText' e' text', o è uno dei due. – AMI289

+0

Vedere la risposta È possibile grassetto Testo particolare in textView. –

+0

@KiritModi So che puoi accoppiarti. Ma vedi la domanda, in particolare l'ultima riga di codice. alla fine usa 'NSString' per il suo' UITextView', e non 'NSAttributedString'. Non puoi mettere in grassetto il testo in uno standard 'NSString'. – AMI289

risposta

19

È anche possibile impostare il modo seguente se si desidera impostando un dizionario nel suo insieme, come attributo

NSString *strTextView = @"This is some demo Text to set BOLD"; 

NSRange rangeBold = [strTextView rangeOfString:@"BOLD"]; 

UIFont *fontText = [UIFont boldSystemFontOfSize:10]; 
NSDictionary *dictBoldText = [NSDictionary dictionaryWithObjectsAndKeys:fontText, NSFontAttributeName, nil]; 

NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:strTextView]; 
[mutAttrTextViewString setAttributes:dictBoldText range:rangeBold]; 

[textViewTermsPolicy setAttributedText:mutAttrTextViewString]; 
+0

Cosa succede se volessi mettere in grassetto un'altra parola oltre a BOLD? Ad esempio, questo è un ** testo dimostrativo ** per impostare ** BOLD **? –

+0

Spero che tu abbia risolto il problema che stavi affrontando ma ancora se non hai appena sostituito "BOLD" con "demo Text" – channi

6

Usa il codice sottostante per impostare la stringa Attribute in TextView.

NSString *infoString [email protected]"I am Kirit Modi from Deesa."; 

    NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:infoString]; 

    UIFont *font_regular=[UIFont fontWithName:@"Helvetica" size:20.0f]; 
    UIFont *font_bold=[UIFont fontWithName:@"Helvetica-Bold" size:20.0f]; 

    [attString addAttribute:NSFontAttributeName value:font_regular range:NSMakeRange(0, 4)]; 

    [attString addAttribute:NSFontAttributeName value:font_bold range:NSMakeRange(5, 15)]; 

    [attString addAttribute:NSFontAttributeName value:font_regular range:NSMakeRange(16, infoString.length - 15 - 1)]; 

    [self.txtView setAttributedText:attString]; 

uscita:

enter image description here

+0

Grazie! Sta funzionando. – Raja

0

Partenza miglioramento @CrazyYoghurt su @Bbrame e @BenoitJadinon su questo precedente interrogazione SO 3586871 ho usato per più di un anno e funziona benissimo . Una limitazione: non penso che tu possa sfoggiare più volte la stessa stringa se appare più di una volta nella tua stringa originale. Ma probabilmente puoi spendere il codice per farlo, se lo desideri.

2

Se è anche necessario filtrare alcune parole da UITextView e evidenziare/cambiare colore di quel particolare testo, è possibile utilizzare il seguente codice.

Qui, sto recuperando tutto il testo del documento nella stringa Contenuto e filtro del testo particolare che è in ebraico.

NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithString:content attributes:nil]; 
[aStr addAttribute:NSLinkAttributeName value:@"http://www.apple.com" range:[content rangeOfString:@"מדיניות פרטיות"]]; 
[aStr addAttribute:NSLinkAttributeName value:@"http://www.google.com" range:[content rangeOfString:@"לינק"]]; 
textview.linkTextAttributes = @{NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)}; 
textview.delegate = (id)self; 

//...You può secondo il vostro colore personalizzato

[aStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[content rangeOfString:@"מדיניות פרטיות"]]; 
[aStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[content rangeOfString:@"לינק"]]; 

// qui si può anche aggiungere il gesto rubinetto su quel testo. // Tap gesto

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTextView:)]; 
      [textview addGestureRecognizer:tapRecognizer]; 
      [textview setAttributedText:aStr]; 
      textview.textAlignment=NSTextAlignmentRight; 

// Per ottenere la posizione del testo nel gesto rubinetto

-(void)tappedTextView:(UITapGestureRecognizer *)tapGesture 

{ 
    UITextView *textView = (UITextView *)tapGesture.view; 
    CGPoint tapLocation = [tapGesture locationInView:textView]; 
    UITextPosition *textPosition = [textView closestPositionToPoint:tapLocation]; 
    NSDictionary *attributes = [textView textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward]; 
    NSString *urlStr = attributes[NSLinkAttributeName]; 
    if (urlStr) 

    { 
     //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",url]]]; 

     PrivacyViewController *next = [PrivacyViewController new]; 
     [self.navigationController pushViewController:next animated:YES]; 
    } 
} 
+0

ha funzionato per me. Grazie! –

+0

Ho usato questo codice e questo funziona per me. Grazie!! –