Нажмите Жест на части UILabel

Я мог бы успешно добавить жесты касания к части UITextView с помощью следующего кода:

UITextPosition *pos = textView.endOfDocument;// textView ~ UITextView

for (int i=0;i<words*2-1;i++){// *2 since UITextGranularityWord considers a whitespace to be a word

    UITextPosition *pos2 = [textView.tokenizer positionFromPosition:pos toBoundary:UITextGranularityWord inDirection:UITextLayoutDirectionLeft];
    UITextRange *range = [textView textRangeFromPosition:pos toPosition:pos2];
    CGRect resultFrame = [textView firstRectForRange:(UITextRange *)range ];

    UIView* tapViewOnText = [[UIView alloc] initWithFrame:resultFrame];
    [tapViewOnText addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(targetRoutine)]];
    tapViewOnText.tag = 125;
    [textView addSubview:tapViewOnText];

    pos=pos2;
}

Я хочу подражать тому же поведению в UILabel, Проблема в том, UITextInputTokenizer (используется для токенизации отдельных слов) объявляется в UITextInput.h, и только UITextView & UITextFieldсоответствовать UITextInput.h; UILabel не. Есть ли обходной путь для этого?

5 ответов

Решение

Вы можете попробовать https://github.com/mattt/TTTAttributedLabel и добавить ссылку на ярлык. Когда ссылка нажата, вы получаете действие, поэтому часть щелчка по ярлыку работает, единственное, что вам нужно, это настроить часть ярлыка по ссылке. Я пробовал это в прошлом, и это работало безупречно, но мой клиент не был заинтересован в использовании стороннего компонента, поэтому дублировал эту функциональность, используя UIWebView и HTML.

Попробуй это. Пусть ваш ярлык будет label:

  //add gesture recognizer to label
  UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] init];
  [label addGestureRecognizer:singleTap];
  //setting a text initially to the label
  [label setText:@"hello world i love iphone"];

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {

UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];

CGRect rect = label.frame;
CGRect newRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width/2, rect.size.height);

if (CGRectContainsPoint(newRect, touchPoint)) {
    NSLog(@"Hello world");
}
}

Нажатие на первую половину метки будет работать (это дает вывод журнала). Не другая половина.

Вот облегченная библиотека специально для ссылок в UILabel FRHyperLabel.

Для достижения такого эффекта:

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Pellentesque quis blandit eros, садитесь за руль. Нам на урне нек. Maecenas ac sem e se se porta dictum nec vel Tellus.

используйте код:

//Step 1: Define a normal attributed string for non-link texts
NSString *string = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque quis blandit eros, sit amet vehicula justo. Nam at urna neque. Maecenas ac sem eu sem porta dictum nec vel tellus.";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]};

label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];


//Step 2: Define a selection handler block
void(^handler)(FRHyperLabel *label, NSString *substring) = ^(FRHyperLabel *label, NSString *substring){
    NSLog(@"Selected: %@", substring);
};


//Step 3: Add link substrings
[label setLinksForSubstrings:@[@"Lorem", @"Pellentesque", @"blandit", @"Maecenas"] withLinkHandler:handler];

Одним из вариантов будет использование не редактируемого UITextView вместо UILabel. Конечно, это может или не может быть подходящим решением в зависимости от ваших конкретных потребностей.

Это основной код для того, как можно добавить UITapGestureRecognizer под ваш контроль;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];        
[MyLabelName addGestureRecognizer:singleTap];        
[self.view addSubView:MyLabelName]

Это метод, который вызывается, когда вы нажали MyLabelName;

-(void)handleSingleTap:(UILabel *)myLabel
{
    // do your stuff;
}
Другие вопросы по тегам