Подтвердить что ты не робот

Есть ли способ сделать невидимый UIButton, который все еще "будет там" и поймать события касания для моего UIImageView?

Я считал умным и просто добавлял прозрачный UIButton поверх UIImageView с точным размером кадра, чтобы я мог легко подключить его к любому событию, которое мне нравится, например TouchUpInside, и заставить его вызвать метод действия когда пользователь прикасается к нему. Ну, это работает, пока альфа не станет ниже 0,1f. Если я сделаю 0.01f, это не сработает. Поэтому, чтобы заставить его работать, глядя долгое время на экран, вы увидите, что 0.1f альфы сияет. И это полностью отвратительно;)

Похоже, iPhone OS пытается быть умным и не будет захватывать события на кнопке, если визуально ее не будет. Любая идея, как это решить?

Конечно, я мог бы создать подкласс UIImageView и реализовать touchhesBegan:... и т.д., но он не чувствует себя действительно элегантно. Я имею в виду... когда я хочу гиперссылку на изображение в Интернете, я бы никогда не захотел создать свой собственный HTML-элемент для этого образа, просто подключив его к URL-адресу, когда он щелкнул. Это просто не имеет для меня большого смысла.

4b9b3361

Ответ 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