как заставить распознаватель жестов работать в анимационном представлении UIImage

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

может кто-нибудь дать мне совет?

РЕДАКТИРОВАТЬ: в итоге я его не использовал, вместо этого я установил UIButton.

Спасибо :)

viewDidLoad

self.defaultID = [[NSMutableArray alloc] initWithObjects:@"7",@"9",@"11",@"27",@"6",nil];
self.defaultImageCaption = [[NSMutableArray alloc] initWithObjects:@"Ver",@"Green",@"Red",@"CF",@"Dwarf",nil];

//default image
imageViewTop.alpha = 1.0;
imageViewBottom.alpha = 0.0;
imageViewBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0,44,320,367)];
imageViewTop = [[UIImageView alloc] initWithFrame:CGRectMake(0,44,320,367)];

singleDefaultTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDefaultTap:)];
singleDefaultTap.numberOfTouchesRequired = 1;
imageViewTop.userInteractionEnabled = YES;
[imageViewTop addGestureRecognizer:singleDefaultTap];
imageViewTop.tag = 2000;

UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0,44,320,367)];
[topView addSubview:imageViewTop];
[self.view addSubview:imageViewTop];
[self.view addSubview:topView];
[self.view addSubview:imageViewBottom];

[self nextAnimation]

-(void)nextAnimation{

//picture loop
imageViewTop.image = imageViewBottom.image;
imageViewBottom.image = [imageArray objectAtIndex:[imageArray count] - 1];

[imageArray insertObject:imageViewBottom.image atIndex:0];
[imageArray removeLastObject];
imageViewTop.alpha = 1.0;
imageViewBottom.alpha = 0.0;

[UIView animateWithDuration:4.0
                 animations:^{ 
                     imageViewTop.alpha = 0.0;
                     imageViewBottom.alpha = 1.0;
                     } 
                 completion:^(BOOL  completed){
                     [self nextAnimation:stringsize.width];
                 }
 ]; 

действие

// показать ваше оповещение...

NSLog(@"tapped");

flowerDetails = [[FlowerDetailViewController alloc] initWithNibName:@"FlowerDetailViewController" bundle:Nil] ;
Fr *fr = nil;

//нажмите, чтобы просмотреть детали цветка


person Desmond    schedule 01.12.2011    source источник


Ответы (3)


Это связано с тем, что при применении анимации изменение любого значения спрайта (в вашем случае UIImageView) с помощью анимации не применяется к оригиналу спрайта, оно применяется к его .layer.presentationLayer, реальный все еще находится в своем оригинальное место. В этом случае вы можете попробовать следующее: поместите свой жест на весь экран, когда ответ придет от события, вы проверяете точку касания, делаете хит-тест на презентационный слой, если да, то делайте то, что хотите.

Я обычно использую приведенный ниже код для этого.

- ( BOOL ) areYouThere: ( CGPoint ) point {
    return ( [ ( ( CALayer * )sprite.layer.presentationLayer ) hitTest: point ] != nil );
}

Получите точку касания из объекта UITouch, когда вызывается метод ниже

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
person GeFo.GT    schedule 01.12.2011

Я бы добавил прозрачный вид поверх изображения и добавил к нему распознаватель жестов.

person dasdom    schedule 01.12.2011
comment
я вижу, как передать значение на основе прозрачного представления? - person Desmond; 01.12.2011
comment
Я не понимаю вашего вопроса. - person dasdom; 01.12.2011

Очень поздно, но я столкнулся с той же проблемой и нашел то, что считаю лучшим решением:

Просто используйте параметр UIViewAnimationOptionAllowUserInteraction следующим образом:

[UIView animateWithDuration:4.0
                      delay:0
                    options:UIViewAnimationOptionAllowUserInteraction
                 animations:^{ 
                     imageViewTop.alpha = 0.0;
                     imageViewBottom.alpha = 1.0;
                 } 
                 completion:^(BOOL  completed){
                     [self nextAnimation:stringsize.width];
                 }
];
person Johann Fradj    schedule 18.06.2015