Есть ли способ создать невидимую кнопку UIB, которая все еще будет «присутствовать», и перехватывать события касания для моего UIImageView? - PullRequest
27 голосов
/ 27 мая 2009

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

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

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

Ответы [ 11 ]

44 голосов
/ 27 мая 2009

Вы должны иметь возможность установить для кнопки «Тип» значение «Пользовательский» в Интерфейсном Разработчике, и она не будет отображать текстовые или графические элементы над UIImageView. Таким образом, вам не нужно настраивать альфа. Если представление построено из кода, используйте:

button = [UIButton buttonWithType:UIButtonTypeCustom];
3 голосов
/ 11 апреля 2011

Лучший способ сделать это:

myButton.hidden = YES;

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

3 голосов
/ 18 августа 2009

В дополнение к 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];
1 голос
/ 08 ноября 2017

Вы можете скрыть кнопку (или любой объект) и сохранить ее активной, добавив маску к ее слою. Кнопка будет невидимой, но все равно будет перехватывать события.

let layer = CAShapeLayer()
layer.frame = .zero
myButton.layer.mask = layer
1 голос
/ 27 мая 2009

Я также считаю, что вы можете назначить изображение кнопке.

Изображение может занимать весь кадр, а также может не иметь других артефактов кнопки, если вы настроите его правильно.

проверить объект

UIButtonInstance.currentImage

Таким образом, вы не перегружаете свои ресурсы элементами, которые по сути уже есть.

0 голосов
/ 18 марта 2016

Мне удалось сделать это, используя следующий код. Если 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;
   }

}
0 голосов
/ 25 марта 2014

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);

Задать рамку кнопки и изображение имеют одинаковую рамку. Я использую этот код и работаю нормально. Также задайте фоновое изображение кнопки дляState: UIControlStateHighlighted так, чтобы при нажатии на него появлялся эффект щелчка.

0 голосов
/ 28 сентября 2012

Пользовательские кнопки UIB реагируют на действия пользователя, если их альфа не установлен на 0. Поместите пользовательскую кнопку UIB поверх вашего imageView и подключитесь к действию buttonPressed. Я также установил дополнительное выделенное изображение для своего 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;

}
0 голосов
/ 04 сентября 2012

Это единственный способ, который я нашел ...

[yourButton setImage:[UIImage imageNamed:@"AnEmptyButtonWithTheSameSize.png"] forState:UIControlStateNormal];

Позаботьтесь об изображении. Должно быть .png

0 голосов
/ 03 мая 2012

Это то, что я сделал, но с использованием подкласса UIButton, который, как я выяснил позже, не должен быть подклассом согласно сети. Мой подкласс назывался Points

Точки * mypoint = [Точка buttonWithType: UIButtonTypeCustom];

тогда, если у вас есть изображение, которое вы хотите добавить к кнопке: [mypoint setImage: imageNamed: @ "myimage"] forstate: UIControlStateNormal];

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

...