S 6 • Formatierter Text in UITextView • Fett, Kursiv, Unterstrichen, Groß, Klein • Kaum anpassbar • System-eigene Text-Selektion für Subklassen von UITextView
E T E X TAT T R I B U T E • Unterstreichungs- und Durchstreichungsstile: • Doppelt, Dick, Gestrichelt, Gepunktet • Text-Grundlinie verschieben • Hintergrundfarben
S O N S T N O C H … • Serialisierung von Text mit Attributen • Textstile: systemweit einheitliche Schriften • Einstellbar vom Nutzer (Größe, Fett) • Texteffekte. Ohne Worte.
T- A B L A U F 1 2 3 4 5 6 NSLayoutManager überwacht NSTextStorage Zeichen in Glyphen übersetzen NSTextContainer bestimmt verfügbaren Bereich Bereiche mit Zeilen füllen Zeilen mit Zeichen füllen: Umbruch, Trennung UITextView invalidieren, NSLayoutManager zeichnet
Y S T E M K L A S S E N Ü B E R S I C H T NSString NSAttributedString NSTextStorage NSLayoutManager NSTextContainer NSTextView NSTypesetter NSGlyphGenerator Cocoa Text System CoreText NSInputManager
R A N G E H E N • Farben bestimmt NSTextStorage > ableiten - (NSString *)string; - (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRange *)range; - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str; - (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range;
T E X T S T O R A G E A B L E I T E N @implementation TKDHighlightingTextStorage { NSMutableAttributedString *_imp; } - (id)init { self = [super init]; if (self) { _imp = [NSMutableAttributedString new]; } return self; }
T T E R - M E T H O D E N - (NSString *)string { return _imp.string; } - (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRange *)range { return [_imp attributesAtIndex:location effectiveRange:range]; }
T T E R - M E T H O D E N - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str { [_imp replaceCharactersInRange:range withString:str]; [self edited:NSTextStorageEditedCharacters range:range changeInLength:(NSInteger)str.length - (NSInteger)range.length]; } - (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range { [_imp setAttributes:attrs range:range]; [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; }
X T S T O R A G E I N S TA L L I E R E N _textStorage = [TKDHighlightingTextStorage new]; [_textStorage addLayoutManager: self.textView.layoutManager];
Y N TA X ” F E S T L E G E N - (void)processEditing { static NSRegularExpression *iExpression; iExpression = iExpression ?: [NSRegularExpression regularExpressionWithPattern: @"i[\\p{Alphabetic}&&\\p{Uppercase}][\\p{Alphabetic}]+" options:0 error:NULL];
Y N TA X ” E R K E N N E N NSRange paragaphRange = [self.string paragraphRangeForRange: self.editedRange]; [self removeAttribute:NSForegroundColorAttributeName range:paragaphRange]; [iExpression enumerateMatchesInString:self.string options:0 range:paragaphRange usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { [self addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:result.range]; }];