在UITextView中突出显示一行

时间:2016-06-28 16:34:58

标签: ios uitextview nsattributedstring

我有一个UITextView,其中NSAttributedString在每行之间有两个换行符。我试图在textview中突出显示一行。我可以简单地在textview中突出显示一个句子而没有任何问题。但是,我需要从行的开头(textview的左侧)到行尾(textview的右侧)突出显示句子

我使用以下代码突出显示来自此Github Sample的行。由于每一行都有两个换行符,我想在突出显示实际句子后,我还可以获得上一个和下一个换行符并突出显示它们。但结果并不像我想要的那样。

enter image description here

 // 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)];
                         }
                     }];

2 个答案:

答案 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";

然后你得到了理想的结果。