як я можу виявити сенсорну подію UIImageView


97

Я розмістив зображення (UIImageView) на панелі навігації. Тепер я хочу виявити сенсорну подію і хочу обробити подію. Не могли б ви сказати мені, як я можу це зробити?

Дякую.


У цій ситуації я (і, думаю, вам слід) використовувати замість нього користувацький UIButton.
titaniumdecoy

Перевірити Swift version Answer http://stackoverflow.com/a/41328885/3177007
Mohamed Jaleel Nazir

Відповіді:


137

На практиці не робіть цього.

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

Ви можете використовувати цю техніку для багатьох випадків, коли ви хочете, щоб певна область екрана діяла як кнопка замість того, щоб возитися з сенсорними речами.


Я додав кнопку на панелі навігації, і я також можу обробляти події дотику. Однак я хочу додати кругле зображення на цю кнопку. Чи можете ви дозволити мені знати, як я можу це зробити програмно? Крім того, чи можете ви повідомити мені, як я можу програмно встановити властивість кнопки "на замовлення"?
рахунок

Подивіться на документи для UIButton - вам потрібно встановити фонові зображення для стану керування, вам потрібні різні зображення для Normal vs. Selected / Highlight. Стиль кнопок - це те, що ви встановили на UIButtonStyleCustom, я вважаю - ще раз подивіться на документи для властивості стилю в UIButton.
Кендалл Гельмстеттер Гельнер

1
Чи не додається UIButton поверх UIImageView трохи зверху? Ви додаєте додатковий об'єкт, тоді як ви можете просто реалізувати способи дотиків вже існуючого об'єкта UIImageView. Немає?
samvermette

32
Якщо ви подивитеся на розмір UIButton в пам'яті, це практично нічого, і у вас є лише кілька на екрані. Що ви отримуєте безкоштовно - це цілі проводки для цільових дій для різних станів (наприклад, торкніться всередині), а також приємна поведінка, як не спрацьовування, коли ви натискаєте вниз, а проведіть пальцем убік. В основному кнопки - це один із найбільш тонко оброблених об’єктів у всій системі, і подумати, що ви збираєтеся робити спеціальний сенсорний код, який працює краще, - це божевілля. Використовуйте дешеве і добре працює, окрім замовлених робіт для речей, з якими рамки вже не обробляють вас.
Кендалл Гельмстеттер Гельнер

6
Ви також можете накладати UIControl, якщо все, що вам потрібно, це сенсорні події (через addTaget: action: forControlEvents :). Це трохи дешевше, ніж UIButton, який має зображення та кілька станів. Крім того, я використовую умовні умови попереднього процесу, щоб змінити колір фону накладеного керування на рожевий, щоб я міг точно бачити, де вони знаходяться (і пам’ятайте, що вони існують :-).
Джефф

115

UIImageViewЄ похідним від UIViewякого походить від UIResponderтак що готовий обробляти події дотику. Ви хочете , щоб забезпечити touchesBegan, touchesMovedі touchesEndedметоди , і вони будуть викликатися , якщо користувач вводить зображення. Якщо все, що ви хочете, це подія крана, простіше просто скористатися спеціальною кнопкою із зображенням, встановленим як зображення кнопки. Але якщо ви хочете більш тонкий контроль над кранами, рухами тощо, це шлях.

Ви також захочете переглянути ще кілька речей:

  • Замініть canBecomeFirstResponderта поверніть ТАК, щоб вказати, що погляд може стати центром подій дотику (за замовчуванням - НІ).

  • Встановіть userInteractionEnabledвластивість на YES. Типово для " UIViewsТАК", але для " UIImageViewsНІ", тому ви повинні явно ввімкнути його.

  • Якщо ви бажаєте реагувати на події, що стосуються кількох дотиків (наприклад, притискання, збільшення та ін.), Вам потрібно встановити multipleTouchEnabledYES.


Я спробував це, але ніколи не отримую дотиківпочаток подій ... чому це так?
Маркус

5
@Markus: У мене була така ж проблема, але виправили її, встановивши userInteractionEnabledYES на батьківському поданні. Дивіться stackoverflow.com/questions/5887305/…
Saxon Druce

51

Щоб додати подію дотику до UIImageView, використовуйте наступне у своєму .m

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

сподівання, що допомагає.


userInteractionEnabled = true - це та частина, яку легко забути, дякую.
Майкл Петерсон

23

Ви також можете додати UIGestureRecognizer. Це не вимагає від вас додавання додаткового елемента в ієрархію перегляду, але все ж надає вам все добре написаний код для обробки подій на дотик із досить простим інтерфейсом:

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];

10
НЕ забудьте встановити UserInteractionEnabled для imgView_
Anonymous White

13

Протягом останніх кількох годин я був на різних темах, намагаючись знайти рішення своєї проблеми, безрезультатно. Я бачу, що багато чортів поділяють цю проблему, і я думаю, що люди знають про це. У мене декілька зображень всередині UIScrollView, намагаючись отримати події на них.

не отримую жодних подій від UIImangeView, але я отримую подію від аналогічної UILableз дуже схожими параметрами, яку я встановлюю їй. під IOS 5.1.

Я вже зробив наступне:

  1. встановити setUserInteractionEnabled на ТАК і для `UIImageView, і для батьківського подання.
  2. встановити setMultipleTouchEnabled на ТАК для UIImageView.
  3. Спробував підкласифікацію UIImageView, не допоміг жоден.

Приєднуючи деякий код нижче, у цьому коді я ініціалізую і a, UIImageViewі UILabelмітка працює чудово з погляду стрільби. Я намагався зберігати невідповідний код. Дякую, хлопці, Ілан

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];    
self.myScrollView.userInteractionEnabled=YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];  
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;

І метод, який обробляє подію:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@",[tappedView class]);
}

Як було сказано, кран етикетки отриманий.


6

Замість того, щоб зробити доторканий UIImageView, а потім розмістити його на навігаційній панелі, вам слід просто створити UIBarButtonItem, який ви створюєте з UIImageView.

Спочатку перегляньте зображення:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

Потім виведіть елемент панелі з перегляду зображення:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

Потім додайте елемент панелі кнопки до панелі навігації:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

Пам'ятайте, що цей код переходить до контролера перегляду, який знаходиться всередині масиву контролера перегляду контролера навігації. Таким чином, цей "елемент, який виглядає на панелі кнопок із зображенням" відображатиметься на панелі навігації лише тоді, коли цей контролер перегляду буде показаний. Якщо натиснути інший контролер перегляду, цей елемент панелі навігації зникне ~


3

Що ви, можливо, захочете зробити, це замінити touchesBegan:withEvent:метод UIView(або підкласу), який містить UIImageViewпідперегляд.

У рамках цього методу перевірити, чи UITouchпотрапляє якийсь із дотиків всередині меж UIImageViewекземпляра (скажімо, він називається imageView).

Тобто, чи перетинається CGPointелемент [touch locationInView]із CGRectелементом [imageView bounds]? Погляньте на функцію CGRectContainsPointдля запуску цього тесту.


Спасибі за Вашу відповідь. Я додав подання так: [navBar addSubview: self.pImage]; // додано як підпогляд панелі навігації. Я перекрив функцію, але функція ніколи не викликається. Я все ж встановив властивість userInteractionEnabled з UIImageView на ТАК. Я щось пропускаю?
рахунок

Ознайомтеся з дотиками метод «Біг: зEvent:». У пошукових системах є багато прикладів того, як це працює.
Алекс Рейнольдс

1

Спочатку слід розмістити UIButton, потім або ви можете додати фонове зображення для цієї кнопки, або вам потрібно розмістити UIImageView над цією кнопкою.

або

Ви можете додати жест дотику до UIImageView, щоб отримати дію кліку при натисканні на UIImageView.


0

Для тих, хто шукає рішення Swift 4 на цю відповідь. Ви можете використовувати наступне для виявлення сенсорної події на UIImageView.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

Потім вам потрібно буде визначити свій селектор так:

@objc func imageViewTapped() {
    // Image has been tapped
}

-2

Додайте жест до цього образу view.add у цей вигляд, тоді це також буде виявляти жест на зображенні. Дякую

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.