2016-04-18 2 views
4

Я делаю динамический UIViews через код и пытаюсь добавить UITapGestureRecogniser на них. Но по какой-то причине они не реагируют. Вот код:UITapGesture не работает на динамически созданных UIViews

-(void)createRandomBlock{ 
    UIView * block = [[UIView alloc] initWithFrame:CGRectMake([self getRandomPosition], 0-_heightOfBlock, _widthOfBlock, _heightOfBlock)]; 
    block.backgroundColor = [self randomColor]; 
    block.userInteractionEnabled=YES; 

    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
    tapGesture.delegate = self; 
    tapGesture.numberOfTouchesRequired = 1; 
    tapGesture.numberOfTapsRequired=1; 
    [block addGestureRecognizer:tapGesture]; 

    [self.view addSubview:block]; 

    [UIView animateWithDuration:_durationOfAnimation delay:0.0 options:options animations:^{ 
     [block setFrame:CGRectMake(block.frame.origin.x, ScreenHeight, block.bounds.size.width, block.bounds.size.height)]; 
    } completion:^(BOOL finished) { 
     [block removeFromSuperview]; 
    }]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"I am being called?"); 
    UIView * block = (UIView*)[gesture view]; 
    [block removeFromSuperview]; 
} 

Может кому-то помочь?

Thanks

+0

- это createRandomBlock, вызываемый один раз? – George

+0

Предположительно вы можете увидеть представление на экране? какие другие жесты на вид и надзор? – Wain

+0

createRandomBlock вызывается с использованием таймера с задержкой в ​​3 секунды. Кроме того, я использую uiviewanimate для анимации представления. –

ответ

1

Я пробовал с тем же кодом, это сработало для меня. Только изменение быть, я не назначил делегат для tapGesture.

-(void)createRandomBlock{ 
    UIView * block = [[UIView alloc] initWithFrame:randomPosition]; 
    block.backgroundColor = [self randomColor]; 
    block.userInteractionEnabled=YES; 

    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
    tapGesture.numberOfTapsRequired=1; 
    [block addGestureRecognizer:tapGesture]; 

    [self.view addSubview:block]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"I am being called?"); 
    UIView * block = (UIView*)[gesture view]; 
    [block removeFromSuperview]; 
} 

Я думаю, из-за добавления делегата, он переопределяет селектор, который вы указали и вызывает методы делегата вместо этого.

+0

Можете ли вы попробовать обновленный код. Я думаю, что мой UIViewAnimate вызывает проблему. –

+0

@WarisAli: Можете ли вы правильно рассказать, что вы пытаетесь сделать в анимации. Посмотрев на код, мне кажется, что вы создаете представление, а затем анимируете представление после завершения, удаляя его. Когда вы хотите вызвать селектор межсетевого экрана. Не могли бы вы быть более ясными. –

+0

@WarisAli: Это может помочь: http://stackoverflow.com/questions/4311645/uiview-touchesbegan-doesnt-respond-during-animation/4432546#4432546 –

1

Вы можете немного ошибиться при установке рамки. пожалуйста, измените комплект рамок &, вы можете решить свою проблему.

-(void)createRandomBlock{ 
    int x_coord = arc4random() % 200; //Random number from 0-320 // set random x position 
    int y_coord = arc4random() % 481; //Random number from 0-480 // set random y position 

    UIView * block = [[UIView alloc] initWithFrame:CGRectMake(x_coord, y_coord, 100, 100)]; // for testing set width & height 100 * 100 
    block.backgroundColor = [UIColor redColor]; // for fix color you can use your change color function 
    block.userInteractionEnabled=YES; 

    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
    tapGesture.delegate = self; 
    tapGesture.numberOfTouchesRequired = 1; 
    tapGesture.numberOfTapsRequired=1; 
    [block addGestureRecognizer:tapGesture]; 

    [self.view addSubview:block]; 

[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{ 
     [block setFrame:CGRectMake(block.frame.origin.x, 0, block.bounds.size.width, block.bounds.size.height)]; 
    } completion:^(BOOL finished) { 
//  [block removeFromSuperview]; 
    }]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
    NSLog(@"I am being called?"); 
    UIView * block = (UIView*)[gesture view]; 
    [block removeFromSuperview]; 
} 
+0

нет проблем с рамкой uiview. Я вижу uiview на моем основном представлении. X, y, ширина и высота блока корректируются в другом коде. –

+0

Какова высота экрана по умолчанию по умолчанию? проверьте мой код –

+0

#define ScreenHeight [[UIScreen mainScreen] bounds] .size.height –

1

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

self.view.userInteractionEnabled = YES;

+0

Да. Взаимодействие с верхним видом включено. Нет проблем. –

+0

Можете ли вы показать весь код вашего контроллера? –

+0

Несомненно. Вот необходимые файлы. https://www.dropbox.com/sh/puwc6gv09tm0kb4/AAAMEI6mUfXhWplVmOXsBazDa?dl=0 –

1

Я не знаю, что ваш [само getRandomPosition] и _widthOfBlock и т.д. имеют значение в противном случае ниже код работает отлично в моем демо.

-(void)createRandomBlock{ 

UIView * block = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
block.backgroundColor = [UIColor redColor]; 
block.userInteractionEnabled=YES; 

UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
tapGesture.delegate = self; 
tapGesture.numberOfTouchesRequired = 1; 
tapGesture.numberOfTapsRequired=1; 
[block addGestureRecognizer:tapGesture]; 

[self.view addSubview:block]; 
} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 
NSLog(@"I am being called?"); 
UIView * block = (UIView*)[gesture view]; 
[block removeFromSuperview]; 
} 

Update:

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

-(void)createRandomBlock{ 

UIView * block = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
block.backgroundColor = [UIColor redColor]; 
block.userInteractionEnabled=YES; 
block.tag = 100; 
self.view.userInteractionEnabled =YES; 

UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blockTapped:)]; 
// tapGesture.delegate = self; 
// tapGesture.numberOfTouchesRequired = 1; 
tapGesture.numberOfTapsRequired=1; 


[block addGestureRecognizer:tapGesture]; 
[self.view addSubview:block]; 




[UIView animateWithDuration:5.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{ 
    [block setFrame:CGRectMake(block.frame.origin.x, self.view.frame.size.height-200, block.bounds.size.width, block.bounds.size.height)]; 


} completion:^(BOOL finished) { 
    [block removeFromSuperview]; 
}]; 


} 

-(void)blockTapped:(UITapGestureRecognizer*)gesture{ 

NSLog(@"I am being called?"); 
UIView * block = (UIView*)[gesture view]; 
[block removeFromSuperview]; 
} 


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
CGPoint touchLocation = [touch locationInView:self.view]; 
UIView *tempView = [self.view viewWithTag:100]; 

if ([tempView.layer.presentationLayer hitTest:touchLocation]) { 

    NSLog(@"call"); 
    [tempView removeFromSuperview]; 
} 


} 
+0

вы можете попробовать код, который я просто обновленный –

+0

, пожалуйста, игнорируйте случайные функции и переменные, которые я использую. Они отлично работают. –

+0

Проверьте мой обновленный ответ, он работает как ваше требование. :) – Lion

0

Вы удаляете вид в блоке завершения, а это значит, после того, как анимация ваш вид будет удален. Удалите нижнюю строку из блока завершения.

[block removeFromSuperview]; 

Вы не должны этого делать. Ваше представление будет удалено, так как Tap Gesture будет работать.

+0

Вид удаляется после выхода из экрана. –

+0

Я использую его во время анимации. –

+0

Я попытался взять эту линию. Не сделал ничего. Тем не менее этот жест не работает –

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