点击UILabel部分的手势

时间:2013-07-24 06:48:32

标签: iphone ios uilabel uitapgesturerecognizer uitextinput

我可以使用以下代码成功地将轻击手势添加到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&amp; UITextField符合UITextInput.h; UILabel没有。 有没有解决方法??

5 个答案:

答案 0 :(得分:3)

试试这个。让您的标签为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");
}
}

单击标签的前半部分将起作用(它提供日志输出)。不是另一半。

答案 1 :(得分:3)

这是一个轻量级图书馆,专门用于UILabel FRHyperLabel中的链接。

达到这样的效果:

Lorem ipsum dolor坐下来,精神上的精神。 Pellentesque quis blandit色情,坐在车上。在urna neque的Nam。 Maecenas ac sem eu sem 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];

答案 2 :(得分:2)

一种选择是使用不可编辑的UITextView而不是UILabel。当然,根据您的具体需求,这可能是也可能不是合适的解决方案。

答案 3 :(得分:0)

您可以尝试https://github.com/mattt/TTTAttributedLabel并添加指向标签的链接。当按下链接时,你会得到一个动作,因此标签点击的一部分只能用于自定义标签的链接部分。我在过去尝试了这个并且它完美无缺,但是我的客户对使用第三方组件不感兴趣,所以使用UIWebView和HTML复制了这个功能。

答案 4 :(得分:-3)

这是如何向您的控件添加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;
}