Ich habe eine UITextView
, die eine NSAttributedString
mit zwei Zeilenumbrüche zwischen den Zeilen hat. Ich versuche, eine einzelne Zeile in der Textansicht hervorzuheben. Ich kann einen Satz in der Textansicht einfach markieren. Aber ich muss den Satz vom Anfang der Zeile (linke Seite der Textansicht) bis zum Ende der Zeile (rechte Seite der Textansicht) markierenMarkieren Sie eine einzelne Zeile in UITextView
Ich habe den folgenden Code verwendet, um eine Zeile zu markieren, die ist von diesem Github Sample. Da jede Zeile zwei Zeilenumbrüche hat, dachte ich, nachdem ich den eigentlichen Satz hervorgehoben habe, kann ich auch die vorherigen und nächsten Zeilenumbruchzeichen erhalten und sie auch hervorheben. Aber die Ergebnisse sind nicht so, wie ich es wollte.
// 1. create some fonts
UIFontDescriptor* fontDescriptor = [UIFontDescriptor
preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
UIFontDescriptor* boldFontDescriptor = [fontDescriptor
fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
UIFont* boldFont = [UIFont fontWithDescriptor:boldFontDescriptor size: 0.0];
UIFont* normalFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
if (!_highlightedWorld) {
_highlightedWorld = @"";
}
// Search for the highlighted world by using regex and highlight
NSString* regexStr = _highlightedWorld;
NSRegularExpression* regex = [NSRegularExpression
regularExpressionWithPattern:regexStr
options:0
error:nil];
// Highlighted attributes (Cyan font color, Bold)
NSDictionary* boldAttributes = @{ NSFontAttributeName : boldFont,
NSBackgroundColorAttributeName : [UIColor cyanColor]};
//Normal attributes
NSDictionary* normalAttributes = @{ NSFontAttributeName : normalFont,
NSBackgroundColorAttributeName : [UIColor whiteColor] };
// If the textview has multiple matches, iterate over each match, and highlight each.
[regex enumerateMatchesInString:[_backingStore string]
options:0
range:searchRange
usingBlock:^(NSTextCheckingResult *match,
NSMatchingFlags flags,
BOOL *stop){
// Highlight the actual line
NSRange matchRange = [match rangeAtIndex:0];
[self addAttributes:boldAttributes range:matchRange];
// Get the newline after the highlighted sentence, and highlight it
// Check if we reached the end
if (matchRange.location+matchRange.length < [_backingStore string].length) {
[self addAttributes:boldAttributes range:NSMakeRange(matchRange.location+matchRange.length, 1)];
}
// Get the newline before the highlighted sentence, and highlight it
// Check if we reached the beginning
if (matchRange.location != 0) {
[self addAttributes:boldAttributes range:NSMakeRange(matchRange.location-1, 1)];
}
// 4. reset the style to the original
if (NSMaxRange(matchRange)+1 < self.length) {
[self addAttributes:normalAttributes
range:NSMakeRange(NSMaxRange(matchRange)+1, 1)];
}
}];
Ist Ihr Text immer eine Einkaufsliste, zentriert mit diesen Wagenrücklauf? – Wain
@Wain Keine Einkaufsliste, aber Sätze, zentriert mit zwei Wagenrücklauf. –
Darf ich fragen, wie entscheiden Sie, welche Zeile hervorgehoben werden soll? – Happiehappie