касается обработчика событий для UIImageView - PullRequest
5 голосов
/ 11 марта 2010

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

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

в c # у меня было бы что-то похожее на

Кнопка b = новая кнопка (); b.Нажмите + = мой код обработчика

сейчас у меня есть это

CGRect myImageRect = CGRectMake(0.0f, 0.0f, 141.0f, 151.0f);
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];

myImage.userInteractionEnabled = YES;
[myImage setImage:[UIImage imageNamed:@"myImage.png"]];
myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myImage];
[myImage release];

Что мне нужно сделать, чтобы переопределить события касания?

спасибо

Ответы [ 7 ]

9 голосов
/ 16 марта 2010

Хотя это не полный ответ на ваш вопрос, я думаю, что следующее решение могло бы быть лучше, чем делать обходной путь «невидимая кнопка» .. просто создайте подкласс из UIImageView и переопределите следующий метод:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

 //your UIImageView has been touched :)

 //event -> "A UIEvent object representing the event to which the touches belong."

 //touches -> "A set of UITouch instances in the event represented by event that    represent the touches in the UITouchPhaseEnded phase."

}

надеюсь, это поможет ...

5 голосов
/ 08 января 2012

У меня есть основной вид с некоторыми значками, такими как «о», чтобы открыть вид «о». В соответствующем контроллере (mainview) я добавил обработчик событий для touchesBegan. Кроме того, мне нужно проверить, какой вид был «затронут», так как на нем больше значков. Мой экземпляр UIImageView - "aboutImg", и необходимо проверить взаимодействие с пользователем (т.е. построитель пользовательского интерфейса -> инспектор атрибутов представления).

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == aboutImg){
        [self ShowAbout];
    }
}

Убедитесь, что вы отметили «Взаимодействие с пользователем включено». Это самое простое решение

3 голосов
/ 29 сентября 2010

Просто используйте пользовательскую кнопку UIB с изображением в качестве фонового изображения.

0 голосов
/ 27 августа 2013

Самый простой способ добавить событие onClick в UIImageView или в UIView - это добавить к нему распознаватель жестов касания.

UIImage *myImage = [UIImage imageNamed:@"myImage.png"];
UIImageView *myImageView = [[UIImageView alloc] initWithImage: myImage];

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action: @selector(onImageViewClicked)];
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[self.myImageView addGestureRecognizer:singleTap];
[self.myImageView setUserInteractionEnabled:YES];
0 голосов
/ 27 сентября 2012

Вам не нужно ничего делать с UIImageView. Вы можете использовать UIButton с типом custom и добавить к нему внутреннее действие ... set button.imageview setImage: я-е:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0,0,100,100); //edit for you own frame
UIImage *img = [UIImage imageNamed:@"myimage.png"];
[button setImage:img forState:UIControlStateNormal];

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

0 голосов
/ 11 марта 2010

Я видел другие ответы, предлагающие поместить невидимую кнопку под UIImageView, установить представление изображения на userInteractionEnabled: NO и позволить касаниям пройти до кнопки.

0 голосов
/ 11 марта 2010

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

...