Ashish Agarwal
Ashish Agarwal

Reputation: 14925

Touch detection on UILabel inside UIScrollView

I have a UIScrollView and inside this I have UILabels. I need to detect touch events for the UILabels. At the moment, it is detecting the touch inside the second label only. It ignores the first.

I have the code -

Creating the UIScrollView

backGroundView = [[UIScrollView alloc] init];
backGroundView.frame= self.view.frame;
backGroundView.userInteractionEnabled = YES;
[backGroundView setScrollEnabled:YES];
backGroundView.showsVerticalScrollIndicator = YES;
backGroundView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);
backGroundView.delegate = self;

[self.view addSubview:backGroundView];

Creating the UILabel

UILabel *OneDay = [[UILabel alloc] initWithFrame:CGRectMake(15, stockChart.bounds.origin.y + stockChart.bounds.size.height + 35, 40, 30)];
OneDay.text = @"1d";
OneDay.tag = 1;
OneDay.userInteractionEnabled = YES;
OneDay.layer.borderColor = [UIColor grayColor].CGColor;
OneDay.layer.borderWidth = 1.0f;
OneDay.textAlignment = UITextAlignmentCenter;
[OneDay addGestureRecognizer:detectTimeFrameChange];
[backGroundView addSubview:OneDay];

UILabel *FiveDay = [[UILabel alloc] initWithFrame:CGRectMake(45, stockChart.bounds.origin.y + stockChart.bounds.size.height + 35, 40, 30)];
FiveDay.text = @"5d";
FiveDay.tag = 2;
FiveDay.userInteractionEnabled = YES;
FiveDay.layer.borderColor = [UIColor grayColor].CGColor;
FiveDay.layer.borderWidth = 1.0f;
FiveDay.textAlignment = UITextAlignmentCenter;
[FiveDay addGestureRecognizer:detectTimeFrameChange];
[backGroundView addSubview:FiveDay];

Creating the gesturerecognizer

    UITapGestureRecognizer *detectTimeFrameChange = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(timeFrameLabelTapped:)];
detectTimeFrameChange.numberOfTapsRequired = 1;
[backGroundView addGestureRecognizer:detectTimeFrameChange];

Handling gesture

-(void)timeFrameLabelTapped:(UITapGestureRecognizer*)recognizer{
    if (recognizer.view.tag == 1) {
        NSLog(@"One pressed");
    }
    else if (recognizer.view.tag == 2){
        NSLog(@"2 pressed");
    }
}

Upvotes: 1

Views: 4360

Answers (5)

Tark
Tark

Reputation: 5173

The problem here is that you are trying to use the same gesture recognizer for multiple views. A gesture recognizer can only be attached to a single view at once. You are only receiving events from the last view, because that is the view the recognizer is currently attached to. To fix the issue, simply create a gesture recognizer for each view you want to detect touches in.

Upvotes: 0

Akki
Akki

Reputation: 1

Where have you written the touchesBegan?

If you want to detect the touches in the label you'll have to create a subclass of label and write your touchesBegan there to detect the touch events

Upvotes: 0

Dharmbir Singh
Dharmbir Singh

Reputation: 17535

You can find using tapgesturerecogniser like that...

UITapGestureRecognizer *singleFingerTap = 
  [[UITapGestureRecognizer alloc] initWithTarget:self 
                                          action:@selector(handleSingleTap:)];
[self.scrollview addGestureRecognizer:singleFingerTap];

//The event handling method
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    if(recognizer.view.tag == 1){}
    //Do stuff here...
}

Upvotes: 0

Balu
Balu

Reputation: 8460

Touch events are not detected on UIScrollview for getting your requirement add tap gestures to your label.

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured)];
        [OneDay addGestureRecognizer:singleTap]; 

  -(void)singleTapGestureCaptured{

        NSLog(@"touch detected");
}

Upvotes: 0

V-Xtreme
V-Xtreme

Reputation: 7333

You can use this :

    UITapGestureRecognizer *labelTap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(labelTapped)];
    labelTap.numberOfTapsRequired=1;
    [yourLabel addGestureRecognizer:labelTap];

handle the touch tap event inside labelTapped method:

-(void)labelTapped
{
  //your code to handle tap
}

Upvotes: 3

Related Questions