2013-07-10 12 views
6

sto creando un app in cui ho per implementare la funzionalità in questo modo:Applicare formato RTF sul testo selezionato di UITextView in iOS

1) in TextView

2) Selezionare il testo da TextView

3) Consenti all'utente di applicare la funzionalità grassetto, corsivo e di sottolineatura sul testo selezionato.

Ho iniziato a implementarlo utilizzando NSMutableAttributedString. Funziona in grassetto e in corsivo ma sostituisce il testo testuale con solo il testo selezionato.

-(void) textViewDidChangeSelection:(UITextView *)textView 
{ 
     rangeTxt = textView.selectedRange; 
     selectedTxt = [textView textInRange:textView.selectedTextRange]; 
     NSLog(@"selectedText: %@", selectedTxt); 

} 

-(IBAction)btnBold:(id)sender 
{ 

    UIFont *boldFont = [UIFont boldSystemFontOfSize:self.txtNote.font.pointSize]; 

    NSDictionary *boldAttr = [NSDictionary dictionaryWithObject:boldFont forKey:NSFontAttributeName]; 

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]initWithString:selectedTxt attributes:boldAttr]; 

    txtNote.attributedText = attributedText; 

} 

Qualcuno può aiutarmi per implementare questa funzionalità?

Grazie in anticipo.

+1

Questo è incorporato in 'UITextView' (come da iOS 6.0). Imposta la proprietà 'allowsEditingTextAttributes' su' YES'. – rmaddy

+0

L'ho già fatto. Il mio problema è solo il testo selezionato con grassetto/corsivo rimane in textview. Altro testo rimosso. Voglio sostituire solo il testo selezionato con grassetto/corsivo nel testo textview. –

+2

Abilitando la proprietà 'allowsEditingTextAttributes' non è necessario alcun codice che hai postato. Se selezioni del testo nella visualizzazione del testo, la visualizzazione del testo offre automaticamente l'opzione di menu BUI (grassetto/corsivo/sottolineato). Non è necessario scrivere alcun codice per questo. – rmaddy

risposta

0

Per questo scopo non utilizzare didChangeSelection. Utilizzare invece shouldChangeTextInRange.

Questo perché quando si imposta la stringa attribuita a una nuova non si sostituisce il testo di una determinata posizione. Sostituisci il testo completo con il tuo nuovo testo. È necessario intervallo per individuare la posizione in cui si desidera modificare il testo.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ 

    NSMutableAttributedString *textViewText = [[NSMutableAttributedString alloc]initWithAttributedString:textView.attributedText]; 

    NSRange selectedTextRange = [textView selectedRange]; 
    NSString *selectedString = [textView textInRange:textView.selectedTextRange]; 

    //lets say you always want to make selected text bold 
    UIFont *boldFont = [UIFont boldSystemFontOfSize:self.txtNote.font.pointSize]; 

    NSDictionary *boldAttr = [NSDictionary dictionaryWithObject:boldFont forKey:NSFontAttributeName]; 

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]initWithString:selectedString attributes:boldAttr]; 

    // txtNote.attributedText = attributedText; //don't do this 

    [textViewText replaceCharactersInRange:range withAttributedString:attributedText]; // do this 

    textView.attributedText = textViewText; 
    return false; 
} 
Problemi correlati