2013-04-19 3 views
0

У меня есть UIScrollView, и внутри этого у меня есть UILabels. Мне нужно обнаружить события касания для UILabels. На данный момент он обнаруживает касание только во второй метке. Он игнорирует первый.Обнаружение касания на UILabel внутри UIScrollView

У меня есть код -

Создание в 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]; 

Создание 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]; 

Создание в gesturerecognizer

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

Обработка жест

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

http://stackoverflow.com/questions/1685956/uiscrollview-touchesbegan просто попробуйте это –

+0

Добавить [self.view bringSubviewToFront: [ (UITapGestureRecognizer *)]]; before if (detectizer.view.tag == 1) {... –

ответ

3

Вы можете использовать это:

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

обрабатывать событие касания крана внутри метода labelTapped:

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

можно также передать тег UILabel. Я также буду реализовывать несколько других UILabels, поэтому мне нужно будет определить, какая метка была использована –

+0

@AshishAgarwal: Да, я только что проверил этот код. –

+0

Как вы это сделали? –

0

Где вы написали touchesBegan?

Если вы хотите, чтобы обнаружить штрихи в этикетке вы должны создать подкласс наклейки и написать touchesBegan там обнаружить сенсорные события

+0

Это должно быть в комментарии. –

+0

> Где ты написал штрихи? Нет. Это не так. Ashish использует UITapGestureRecognizer. –

+0

Первоначально это были касанияБега. После прочтения решений я переключился на жесты Recognizers. –

0

сенсорных события не обнаружены на UIScrollview для получения вашего требования добавить водопроводный Гест на ваш лейбл.

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

    -(void)singleTapGestureCaptured{ 

     NSLog(@"touch detected"); 
} 
0

Вы можете найти с помощью tapgesturerecogniser, как ...

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... 
} 
+0

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

+0

. Вы можете так сделать ... просто см. Код сейчас. –

+0

Что случилось, моя дорогая. У вас есть ваша мысль. –

0

Проблема здесь состоит в том, что вы пытаетесь использовать один и тот же жест распознаватель для нескольких представлений. Признак распознавателя может быть присоединен только к одному виду одновременно. Вы получаете только события из последнего представления, потому что это вид, к которому в настоящее время подключен распознаватель. Чтобы устранить проблему, просто создайте распознаватель жестов для каждого вида, в котором вы хотите обнаружить штрихи.

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