Как сделать кликабельный UIButton поверх UIImageView? - PullRequest
9 голосов
/ 27 октября 2011

Я хочу создать UIButton для отображения поверх UIImageView . Мой фрагмент кода показан ниже:

imageView = [[UIImageView alloc] initWithImage:image]; //initWithImage:image

imageView.userInteractionEnabled = YES; //to enable touch interaction with image



UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"ClickMe" forState:UIControlStateNormal];
[btn.titleLabel setFont:[UIFont systemFontOfSize:16]];


 btn.frame = CGRectMake(340, 550, 70, 50);

[btn addTarget:self action:@selector(onClickHotSpotButton)   forControlEvents:UIControlEventTouchUpInside]; //it wasnt working


[imageView addSubview:btn];
[self addSubview:imageView]; 

Мое приложение отображает кнопку точно на той части изображения, где я хочу, но оно не реагирует на изображение клика. Вместо этого это действительно обнаруживает единственный сигнал, поскольку я регистрирую выход на своем обнаружении. Но я хочу, чтобы эту кнопку нажимали на выделение и выполняли какую-то функцию.

Спасибо заранее.

Вахиб

Ответы [ 8 ]

5 голосов
/ 29 мая 2012

Я попробовал это, и это работает для меня .......

UIImageView * imageView = [[UIImageView alloc]init];
[imageView setImage:[UIImage imageNamed:@"image.jpeg"]];
[imageView setFrame:CGRectMake(10,10,300,300)];
[imageView setContentMode:UIViewContentModeScaleToFill];
[imageView setUserInteractionEnabled:TRUE];

UIButton * ButtonOnImageView = [[UIButton alloc]init];
[ButtonOnImageView setFrame:CGRectMake(135,120,60,30)];
[ButtonOnImageView setImage:[UIImage imageNamed:@"image.jpeg"] forState:UIControlStateHighlighted];
 [ButtonOnImageView setImage:[UIImage imageNamed:@"image2.jpeg"] forState:UIControlStateNormal];
[ButtonOnImageView addTarget:self action:@selector(OnClickOfTheButton) forControlEvents:UIControlEventTouchUpInside];

 [imageView addSubview:ButtonOnImageView];
 [self.view addSubview:imageView];
3 голосов
/ 30 октября 2013
  1. Вы должны добавить кнопку определения как пользовательскую. Это будет работать для вас.

    UIButton * Button = [UIButton buttonWithType: UIButtonTypeCustom];

3 голосов
/ 27 октября 2011

Вы можете использовать только одну кнопку и сказать:

[UIButton setImage:[imageNamed:@"image.png"]];
1 голос
/ 17 октября 2012

вам нужно добавить кнопку как подкласс

scrollview

not

imageview

.. это не будет кликабельно, если кнопка является подклассом uiimageview .. назначьте специальную метку для каждой кнопки для распознавания нажатой кнопки

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

0 голосов
/ 04 ноября 2013

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

[btn setEnabled:YES];

Поскольку UIImageView по умолчанию отключает взаимодействие пользователя с кнопкой.

В противном случае вы можете попробовать это. Просто измените последние две строки.

Заменить:

[imageView addSubview:btn];
[self addSubview:imageView]; 

с этим:

[self addSubview:imageView];
[self addSubview:btn];

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

0 голосов
/ 31 октября 2011

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

imageView = [[UIImageView alloc] initWithImage:image]; //initWithImage:image

//imageView.tag = i; // tag our images for later use when we place them in serial form
[imageView setContentMode:UIViewContentModeScaleToFill]; //though it has no impact
imageView.userInteractionEnabled = YES; //to enable touch interaction with image

[self addSubview:imageView];

UIButton *btn = [[UIButton buttonWithType:UIButtonTypeContactAdd] retain]; //Plus icon button

btn.frame = CGRectMake(215, 550, 100, 100);
[btn addTarget:self action:@selector(onClickHotSpotButton) forControlEvents:UIControlEventTouchUpInside]; //it wasnt working

**[self addSubview:btn]; //Buttons are clickable but shows button on all images**

//[imageView addSubview:btn]; //Buttons are not clickable and are shown on all images

У меня есть два варианта обряда. Делаю ли я свою кнопку подпредставлением ImageView или ScrollView, который является родителем ImageView. Если я сделаю подпредставление кнопки Scrollview как [self addSubView: btn]; он отображается в правильном положении и является интерактивным, но проблема в том, что он создается на всех изображениях в очереди, потому что я делаю его подвидом родительского представления, т.е. scrollview. Иначе, если я сделаю это подпредставлением дочернего представления, т. Е. ImageView, которое уникально для каждого изображения, но по-прежнему отображается на всех изображениях и не активируется: /

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

0 голосов
/ 28 октября 2011

Я сделал что-то подобное в одном из моих приложений. Я создал xib-файл, содержащий серию изображений, каждое с кнопкой, нарисованной поверх. Я подключил их к соответствующим выходам в файле класса. Затем я разработал, который был нажат в touchSegan, используя:

if(CGRectContainsPoint(btnFirstButton.frame, touchLocation)){
    //do something useful
}else if(CGRectContainsPoint(btnSecondButton.frame, touchLocation)){
    //do something useful
}

Надеюсь, что поможет - у меня сработало: -)

0 голосов
/ 27 октября 2011

Если изображение кликабельно, я предпочитаю изображение кнопке.

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(kLeftMargin, 10, self.view.bounds.size.width - kLeftMargin -      kRightMargin, 52)];
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
[sampleButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton];
...