2013-07-10 8 views
6

tworzę aplikację, w której trzeba zaimplementować funkcjonalność takiego:Zastosuj formacie RTF na wybranym tekście UITextView w iOS

1) Napisz do TextView

2) Wybierz tekst z TextView

3) Pozwól użytkownikowi na stosowanie pogrubienia, kursywy i podkreślenia na wybranym tekście.

Zacząłem wdrażać za pomocą NSMutableAttributedString. Działa pogrubieniem i kursywą, ale zastępuje tekst w tekście tylko wybranym tekstem.

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

} 

Czy ktokolwiek może mi pomóc w realizacji tej funkcji?

Z góry dziękuję.

+1

Jest to wbudowane w 'UITextView' (od wersji iOS 6.0). Ustaw właściwość 'allowEditingTextAttributes' na wartość' YES'. – rmaddy

+0

Już to zrobiłem. Mój problem polega na tym, że zaznaczony tekst z pogrubieniem/kursywą pozostaje w tekście. Pozostałe teksty są usuwane. Chcę zastąpić tylko zaznaczony tekst pogrubieniem/kursywą w tekście tekstowym. –

+2

Włączając właściwość 'allowEditingTextAttributes', nie potrzebujesz żadnego z opublikowanych przez siebie kodów. Jeśli zaznaczysz jakiś tekst w widoku tekstowym, widok tekstowy automatycznie wyświetli opcję menu BUI (pogrubienie/kursywa/podkreślenie). Nie musisz w tym celu pisać żadnego kodu. – rmaddy

Odpowiedz

0

Do tego celu nie należy używać didChangeSelection. Zamiast tego użyj shouldChangeTextInRange.

Dzieje się tak, ponieważ po ustawieniu przypisanego ciągu na nowy nie zastępuje się tekstu określonej lokalizacji. Zastępujesz pełny tekst nowym tekstem. Potrzebujesz zasięgu, aby zlokalizować pozycję, w której chcesz zmienić tekst.

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