Есть ли способ сделать невидимый UIButton, который все еще "будет там" и поймать события касания для моего UIImageView?
Я считал умным и просто добавлял прозрачный UIButton поверх UIImageView с точным размером кадра, чтобы я мог легко подключить его к любому событию, которое мне нравится, например TouchUpInside, и заставить его вызвать метод действия когда пользователь прикасается к нему. Ну, это работает, пока альфа не станет ниже 0,1f. Если я сделаю 0.01f, это не сработает. Поэтому, чтобы заставить его работать, глядя долгое время на экран, вы увидите, что 0.1f альфы сияет. И это полностью отвратительно;)
Похоже, iPhone OS пытается быть умным и не будет захватывать события на кнопке, если визуально ее не будет. Любая идея, как это решить?
Конечно, я мог бы создать подкласс UIImageView и реализовать touchhesBegan:... и т.д., но он не чувствует себя действительно элегантно. Я имею в виду... когда я хочу гиперссылку на изображение в Интернете, я бы никогда не захотел создать свой собственный HTML-элемент для этого образа, просто подключив его к URL-адресу, когда он щелкнул. Это просто не имеет для меня большого смысла.
Ответы
Ответ 1
Вы должны иметь возможность установить кнопку "Тип" в "Пользовательский" в "Конструктор интерфейсов", и она не будет отображать текстовые или графические элементы над UIImageView. Таким образом, вам не нужно настраивать альфу. Если представление построено из кода, используйте:
button = [UIButton buttonWithType:UIButtonTypeCustom];
Ответ 2
В дополнение к UIButtonTypeCustom, я устанавливаю цвета текста кнопки следующим образом:
[button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor clearColor] forState:UIControlStateHighlighted];
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateHighlighted];
Ответ 3
Лучший способ сделать это:
myButton.hidden = YES;
Вы не можете использовать свойство buttonType, потому что это свойство только для чтения. Единственный способ использовать его - это динамически создавать свою кнопку.
Ответ 4
Кроме того, вы можете назначить изображение кнопке.
Изображение может занимать весь фрейм и не может иметь никаких других артефактов, если вы правильно настроили его.
проверьте свойство
UIButtonInstance.currentImage
Таким образом, вы не забиваете свои ресурсы элементами, которые по существу уже существуют.
Ответ 5
Ответ Jasons выше почти правильный, но установка типа кнопки невозможна. Чтобы программно создать пустую кнопку, используйте этот код:
UIButton* myButton = [UIButton buttonWithType:UIButtonTypeCustom];
myButton.frame=frame;
[self.view addSubview:myButton];
Ответ 6
Это то, что я сделал, но с использованием подкласса UIButton, который позже выяснил, не должен быть подклассифицирован по сети. Мой подкласс назывался Points
Баллы * mypoint = [Points buttonWithType: UIButtonTypeCustom];
то если у вас есть изображение, которое вы хотите добавить к кнопке:
[mypoint setImage: imageNamed: @ "myimage" ] forvate: UIControlStateNormal];
если вы не добавите это изображение, тогда кнопка будет невидимой для пользователя, но должна реагировать на прикосновение. То, как я создал точку доступа на моем изображении, чтобы он реагировал на взаимодействие с пользователем.
Ответ 7
Это единственный способ, которым я нашел...
[yourButton setImage:[UIImage imageNamed:@"AnEmptyButtonWithTheSameSize.png"] forState:UIControlStateNormal];
Соблюдайте изображение. Это должно быть .png
Ответ 8
Пользовательские UIButtons реагируют на взаимодействия пользователей, если их альфа не установлена в 0. Поместите пользовательский UIButton поверх вашего изображения и подключитесь к buttonPressed action. Я также установил дополнительное выделенное изображение для моего UIView, теперь оно действительно ведет себя как UIButton. Сначала я определил продолжительность для UIView для выделения:
#define HIGHLIGHTED_DURATION 0.1
Затем установите отображение изображения, если кнопка нажата, и запустите таймер, чтобы он был подсвечен для этой продолжительности. Не забудьте установить выделенное изображение для вашего изображения.
- (IBAction)buttonPressed:(id)sender {
[_yourImageView setHighlighted:YES];
_timer = [NSTimer scheduledTimerWithTimeInterval:HIGHLIGHTED_DURATION
target:self
selector:@selector(removeHighlighted)
userInfo:nil
repeats:NO];
}
И просто отмените выделение, когда таймер закончит:
-(void) removeHighlighted{
_yourImageView.highlighted = NO;
}
Ответ 9
lazyImageView = [[UIImageView alloc] init];
button=[[UIButton alloc]init];
[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self
action:@selector(aMethodForVideo:)
forControlEvents:UIControlEventTouchUpInside];
[button setBackgroundImage:[UIImage imageNamed:@"BackTransparent.png"] forState:UIControlStateHighlighted];
[button setTitle:@"" forState:UIControlStateNormal];
lazyImageView.frame=CGRectMake(x, y, w, h);
button.frame=CGRectMake(x, y, w, h);
Устанавливаем рамку кнопки, а изображение имеет одинаковый фрейм. Я использую этот код и работаю отлично. Также установите фоновое изображение кнопки для объекта: UIControlStateHighlighted, поэтому, когда вы нажимаете на это, когда вы видите эффект щелчка.
Ответ 10
Мне удалось сделать это, используя следующий код.
Если iPad является ландшафтом, кнопка будет расположена в правом верхнем углу экрана.
UIButton *adminButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
adminButton.frame = CGRectMake(974.0f, 0.0f, 50.0f, 50.0f);
[adminButton setBackgroundColor:[UIColor clearColor]];
[adminButton setTag:1];
[adminButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:adminButton];
При нажатии кнопки "adminButton" будет выполняться следующая функция:
- (void)buttonPressed:(id)sender {
int buttonId = ((UIButton *)sender).tag;
switch(buttonId) {
case 1:
NSLog (@"Admin button was pressed");
break;
case 2:
//if there was a button with Tag 2 this will be called
break;
default:
NSLog(@"Key pressed: %i", buttonId);
break;
}
}
Ответ 11
Вы можете скрыть кнопку (или любой объект) и сохранить ее активной, добавив маску к ее слою. Кнопка будет невидимой, но все равно будет захватывать события.
let layer = CAShapeLayer()
layer.frame = .zero
myButton.layer.mask = layer