Я розмістив зображення (UIImageView) на панелі навігації. Тепер я хочу виявити сенсорну подію і хочу обробити подію. Не могли б ви сказати мені, як я можу це зробити?
Дякую.
Я розмістив зображення (UIImageView) на панелі навігації. Тепер я хочу виявити сенсорну подію і хочу обробити подію. Не могли б ви сказати мені, як я можу це зробити?
Дякую.
Відповіді:
На практиці не робіть цього.
Замість цього додайте кнопку у власному стилі (без графіки кнопок, якщо ви не вказали зображення) через UIImageView. Потім додайте до цього будь-які методи, які ви хочете, викликати.
Ви можете використовувати цю техніку для багатьох випадків, коли ви хочете, щоб певна область екрана діяла як кнопка замість того, щоб возитися з сенсорними речами.
UIImageView
Є похідним від UIView
якого походить від UIResponder
так що готовий обробляти події дотику. Ви хочете , щоб забезпечити touchesBegan
, touchesMoved
і touchesEnded
методи , і вони будуть викликатися , якщо користувач вводить зображення. Якщо все, що ви хочете, це подія крана, простіше просто скористатися спеціальною кнопкою із зображенням, встановленим як зображення кнопки. Але якщо ви хочете більш тонкий контроль над кранами, рухами тощо, це шлях.
Ви також захочете переглянути ще кілька речей:
Замініть canBecomeFirstResponder
та поверніть ТАК, щоб вказати, що погляд може стати центром подій дотику (за замовчуванням - НІ).
Встановіть userInteractionEnabled
властивість на YES. Типово для " UIViews
ТАК", але для " UIImageViews
НІ", тому ви повинні явно ввімкнути його.
Якщо ви бажаєте реагувати на події, що стосуються кількох дотиків (наприклад, притискання, збільшення та ін.), Вам потрібно встановити multipleTouchEnabled
YES.
userInteractionEnabled
YES на батьківському поданні. Дивіться stackoverflow.com/questions/5887305/…
Щоб додати подію дотику до UIImageView, використовуйте наступне у своєму .m
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
сподівання, що допомагає.
Ви також можете додати 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];
Протягом останніх кількох годин я був на різних темах, намагаючись знайти рішення своєї проблеми, безрезультатно. Я бачу, що багато чортів поділяють цю проблему, і я думаю, що люди знають про це. У мене декілька зображень всередині UIScrollView
, намагаючись отримати події на них.
не отримую жодних подій від UIImangeView
, але я отримую подію від аналогічної UILable
з дуже схожими параметрами, яку я встановлюю їй. під IOS 5.1.
Я вже зробив наступне:
UIImageView
.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]);
}
Як було сказано, кран етикетки отриманий.
Замість того, щоб зробити доторканий UIImageView, а потім розмістити його на навігаційній панелі, вам слід просто створити UIBarButtonItem, який ви створюєте з UIImageView.
Спочатку перегляньте зображення:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Потім виведіть елемент панелі з перегляду зображення:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Потім додайте елемент панелі кнопки до панелі навігації:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Пам'ятайте, що цей код переходить до контролера перегляду, який знаходиться всередині масиву контролера перегляду контролера навігації. Таким чином, цей "елемент, який виглядає на панелі кнопок із зображенням" відображатиметься на панелі навігації лише тоді, коли цей контролер перегляду буде показаний. Якщо натиснути інший контролер перегляду, цей елемент панелі навігації зникне ~
Що ви, можливо, захочете зробити, це замінити touchesBegan:withEvent:
метод UIView
(або підкласу), який містить UIImageView
підперегляд.
У рамках цього методу перевірити, чи UITouch
потрапляє якийсь із дотиків всередині меж UIImageView
екземпляра (скажімо, він називається imageView
).
Тобто, чи перетинається CGPoint
елемент [touch locationInView]
із CGRect
елементом [imageView bounds]
? Погляньте на функцію CGRectContainsPoint
для запуску цього тесту.
Для тих, хто шукає рішення 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
}
Додайте жест до цього образу view.add у цей вигляд, тоді це також буде виявляти жест на зображенні. Дякую