2013-05-30 2 views
13

Как выделить текст «сотовый телефон» на картинке?Как выделить текст, как на картинке?

enter image description here

Обновлено

Я хочу искать текст на странице, и если найден, то текст должен быть выделен так, как я показал в прилагаемом изображении.

ответ

17

Выход

OutPut Image

Regular Expressions tutorial содержит подробную информацию о том, как искать нужный текст, используя регулярное выражение на UITextview и как его выделить.

Essential код, который должен быть использован:

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

1) После кода поиска для требуемого рисунка из т.е. данные 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) Здесь мы выделим матчи, полученные из результат сопоставления регулярных выражений с использованием CALayer и метки:

- (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]; 
     } 
    }]; 

    } 

Функция используется для получения кадра согласованного текста в 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 

} 
+0

Thank You So Much, Он работает немного с нужного пути. – Sandy

+0

@ Сэнди звучит здорово! Рад помочь :) –

+0

Не могли бы вы помочь мне получить CGRect из матча String? – Sandy

2

для этого вы должны использовать core Text & для подсветки вы должны нарисовать текст в drawRect метод, т.е. изменение цвета фона на желтый & увеличить размер шрифта текста

tutorial on coreText

+0

Не могли бы вы объяснить более или любые примеры кода? – Sandy

+0

см. Ссылку в ответе –

5

Использование NSMutableAttributedString это может работать для вас.

NSString *myString = @"Hello"; 
NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:myString]; 
NSRange theRange = NSMakeRange(0,[aString length]); 

// Здесь мы устанавливаем переднего плана и цвет фона текста для его выделения.

[aString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"MyriadPro-Bold" size:17.5f] range:theRange]; 
[aString addAttribute:NSForegroundColorAttributeName value:[UIColor purpleColor] range:theRange]; 
[aString addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:theRange]; 

// Вы можете изменить диапазон в зависимости от того, что часть текста, который вы хотите выделить.

+0

Ваш код не работает даже сбой, хотя. Я исправил и передал это в UIlabel, но я не вижу изменения. Пожалуйста, предложите, если я сделал неправильный путь? – Sandy

+0

Я думаю, что вы, должно быть, сделали что-то подобное. UILabel * myLabel = [[UILabel alloc] initWithFrame: CGRectMake (10, 10, 100, 100)]; [myLabel setText: aString]; Вместо этого установите текст как ниже [myLabel setAttributedText: aString]; Надеюсь, он сработает. –

+0

Правильно !! спасибо, но у меня есть ответ. – Sandy

1

Я нашел для вас ссылку, я думаю, что это помогает. Ссылка here

говорится

Вы должны написать свой собственный пользовательский PDF текстового парсер, если вы хотите, чтобы выделить текст (или платить лицензировать решение промежуточного) .Отель формат PDF стар и имеет слой за слоем, добавленным к нему Adobe, некоторые из которых теперь излишни.Документация в формате PDF составляет более 700 страниц и не написана особенно четко, особенно когда вы впервые начинаете ее использовать. Кроме того, существует много разных писателей PDF, и каждый из них имеет собственную интерпретацию формата и позиционирует текст, используя разные команды и комбинации команд.

Чтобы выделить слова, вам необходимо проанализировать каждую страницу (используя вызовы CGPDF) и извлечь текст и позиционные данные. Затем используйте наложение для выделения выделенных блоков поверх отображаемой страницы PDF.

Я думаю, что это помогает.

2

There is a github repository "HighlightedWebView", который достигает практически того же эффекта, что и вы этого.

enter image description here

Drop-в WebView подклассом, который добавляет Safari стиль в странице поиска, результат подсветки.

Смежные вопросы