我有一个UITextView
,其中NSAttributedString
在每行之间有两个换行符。我试图在textview中突出显示一行。我可以简单地在textview中突出显示一个句子而没有任何问题。但是,我需要从行的开头(textview的左侧)到行尾(textview的右侧)突出显示句子
我使用以下代码突出显示来自此Github Sample的行。由于每一行都有两个换行符,我想在突出显示实际句子后,我还可以获得上一个和下一个换行符并突出显示它们。但结果并不像我想要的那样。
// 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)];
}
}];
答案 0 :(得分:1)
我建议您不要使用文字视图。你有一个列表,所以使用表或集合视图更适合这个用例。它们将使处理设备宽度和项目选择变得有效。它们还允许您在项目周围添加其他样式(这可能很方便)。
我以前不需要这样做,但是目前我用文本视图想象你应该看看文本是如何放入布局的,我希望你能做到这一点。需要明确地进行中心对齐,以便您可以选择任一侧的填充,而无需级联到上一行或下一行。这远非微不足道。
我有兴趣知道文本视图问题是否有简单的解决方案,但对于您正在寻找的数据,显示和用户互动而言,这似乎是错误的观点
答案 1 :(得分:-1)
我不知道如何解释这一点,但我相信它与iOS的\ n和\ r解释有关。
我猜你可能通过使用两个\ r或两个\ n即
来创建线间隙NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\r\r3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum";
OR
NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\n\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum";
您的代码突出显示行的方式都会产生与您的相似的输出。
但是,如果你更换第二个&#39; \ n&#39;或者&#39; \ r&#39;用&#39; \ r \ n&#39;即
NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\r\r\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum";
或者
NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\n\r\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum";
然后你得到了理想的结果。