How to highlight text like in the image?

前端 未结 4 552

How to highlight the text \"cell phone\" in the image?

\"enter

Updated

4条回答
  •  日久生厌
    2021-02-07 16:58

    Output

    OutPut Image

    This Regular Expressions tutorial has detail on how to search the desired text using regular expression on UITextview and how to highlight it.

    Essential Code that is to be used:

    - (void)viewDidLoad
    {
      [super viewDidLoad];
      [self searchData];
    }
    

    1) Following code searches for the required pattern from the data i.e TextView:

     - (void) searchData
    {
    
    
        NSError *error = NULL;
        NSString *pattern = @"Hello";  // pattern to search thee data either regular expression or word.
        NSString *string = self.textView.text;
        NSRange range = NSMakeRange(0, string.length);
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
        NSArray *matches = [regex matchesInString:string options:NSMatchingProgress ran     ge:range];
       [self highlightMatches:matches];
    }
    

    2) Here we highlight the matches obtained from the result of regular expression matching by making use of CALayer and label:

     - (void)highlightMatches:(NSArray *)matches
     {
    
    
          __block NSMutableAttributedString *mutableAttributedString = self.textView.attributedText.mutableCopy;
         [matches enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
        {
    
         if ([obj isKindOfClass:[NSTextCheckingResult class]])
         {
             NSTextCheckingResult *match = (NSTextCheckingResult *)obj;
             CGRect rect = [self frameOfTextRange:match.range inTextView:self.textView];
    
             /** Shadow */
    
             CALayer *shadowLayer = [CALayer new];
             shadowLayer.frame = CGRectMake(rect.origin.x, rect.origin.y-4, rect.size.width, rect.size.height);
             shadowLayer.cornerRadius = 5;
    
             shadowLayer.backgroundColor = [UIColor yellowColor].CGColor;
             shadowLayer.shadowColor = [UIColor blackColor].CGColor;
             shadowLayer.shadowOpacity = 0.6;
             shadowLayer.shadowOffset = CGSizeMake(1,1);
             shadowLayer.shadowRadius = 3;
    
             /** Label */
             UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(rect.origin.x, rect.origin.y-4, rect.size.width, rect.size.height)];
             lbl.font = [UIFont fontWithName:@"Helvetica" size:12];
             lbl.textColor = [UIColor blackColor];
             [lbl setText:[[mutableAttributedString attributedSubstringFromRange:match.range] string]];
             lbl.backgroundColor = [UIColor clearColor];
             lbl.textAlignment = NSTextAlignmentCenter;
             lbl.layer.cornerRadius = 10;
    
             /** Add Label and layer*/
    
             [self.view.layer addSublayer:shadowLayer];
             [self.view addSubview:lbl];  
          }
      }];
    
      }
    

    Function used to obtain the frame of the matched text in the textView:

    - (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView
     {
        UITextPosition *beginning = textView.beginningOfDocument; //Error=: request for member 'beginningOfDocument' in something not a structure or union
    
        UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
        UITextPosition *end = [textView positionFromPosition:start offset:range.length];
        UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
        CGRect rect = [textView firstRectForRange:textRange];  //Error: Invalid Intializer
    
        return [textView convertRect:rect fromView:textView.textInputView]; // Error: request for member 'textInputView' in something not a structure or union
    
     }
    

提交回复
热议问题