Косвенный распознаватель жестов - какой объект был использован?
Я новичок в распознаваниях жестов, поэтому, возможно, этот вопрос звучит глупо: я назначаю распознаватели жестов на кучу UIViews. В методе можно узнать, какой из них был использован каким-то образом или мне нужно найти его, используя точку, которая была использована на экране?
for (NSUInteger i=0; i<42; i++) {
float xMultiplier=(i)%6;
float yMultiplier= (i)/6;
float xPos=xMultiplier*imageWidth;
float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
[greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];
greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
greyRect.layer.borderWidth=1.0f;
greyRect.userInteractionEnabled=YES;
[greyGridArray addObject:greyRect];
[self.view addSubview:greyRect];
NSLog(@"greyGrid: %i: %@", i, greyRect);
//make them touchable
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
letterTapRecognizer.numberOfTapsRequired = 1;
[greyRect addGestureRecognizer:letterTapRecognizer];
}
Ответы
Ответ 1
Определите целевой селектор (highlightLetter:
) с аргументом как
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
Затем вы можете получить представление
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped.
}
Ответ 2
Это был год, задавая этот вопрос, но все же для кого-то.
При объявлении UITapGestureRecognizer
для определенного представления назначьте тег как
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;
и в вашем обработчике так
-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
if(sender.view.tag == 2) {
// do something here
}
}
Ответ 3
Вот обновление для Swift 3 и дополнение к ответу Мани. Я бы предложил использовать sender.view
в сочетании с тегированием UIViews (или других элементов, в зависимости от того, что вы пытаетесь отслеживать) для несколько более "продвинутого" подхода.
- Добавление UITapGestureRecognizer, например, UIButton (вы также можете добавить это в UIViews и т.д.) Или целый набор элементов в массиве с циклом for и вторым массивом для жестов касания.
let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction))
yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
Определение функции в том же testController (что и имя вашего View Controller). Здесь мы будем использовать теги - теги - это Int ID, которые вы можете добавить в свой UIView с помощью yourButton.tag = 1
. Если у вас есть динамический список элементов, таких как массив, вы можете создать цикл for, который выполняет итерацию по всему массиву и добавляет тег, который постепенно увеличивается
func yourFunction(_ sender: AnyObject) {
let yourTag = sender.view!.tag // this is the tag of your gesture object
// do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
for button in buttonsArray {
if(button.tag == yourTag) {
// do something with your button
}
}
}
Причина всего этого заключается в том, что вы не можете передать дополнительные аргументы для вашей функции при использовании ее в сочетании С#selector.
Если у вас есть еще более сложная структура пользовательского интерфейса, и вы хотите, чтобы родительский тег элемента был прикреплен к вашему жесту касания, вы можете использовать let yourAdvancedTag = sender.view!.superview?.tag
, например. получение тега UIView нажатой кнопки внутри этого UIView; может быть полезно для миниатюр + списков кнопок и т.д.
Ответ 4
Используйте этот код в Swift
func tappGeastureAction(sender: AnyObject) {
if let tap = sender as? UITapGestureRecognizer {
let point = tap.locationInView(locatedView)
if filterView.pointInside(point, withEvent: nil) == true {
// write your stuff here
}
}
}
Ответ 5
вы можете использовать
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);
}
view будет Объект, в котором распознан признак касания
Ответ 6
Вы также можете использовать метод "shouldReceiveTouch" для UIGestureRecognizer
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch: (UITouch *)touch {
UIView *view = touch.view;
NSLog(@"%d", view.tag);
}
Не забудьте установить делегат вашего распознавателя жестов.
Ответ 7
быстро, это довольно просто
Введите этот код в функции ViewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
tap.numberOfTapsRequired = 2
tapView.addGestureRecognizer(tap)
Часть обработчика это может быть в viewDidLoad или вне viewDidLoad, batter помещается в расширение
@objc func tapHandler(gesture: UITapGestureRecognizer) {
currentGestureStates.text = "Double Tap"
}
здесь я просто тестирую код, печатая вывод
если вы хотите сделать действие, вы можете делать все, что хотите
или больше практики и читать
Ответ 8
Вы должны изменить создание распознавателя жестов, чтобы принять параметр (добавить двоеточие ':')
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
И в вашем методе highlightLetter: вы можете получить доступ к представлению, прикрепленному к распознавателю:
-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
UIView *view = [recognizer view];
}
Ответ 9
Если вы добавляете разные UIGestureRecognizer
в разные UIView
и хотите различить в методе действий, вы можете проверить вид свойства в параметре отправителя, который даст вам представление отправителя.
Ответ 10
func tabGesture_Call
{
let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
tapRec.delegate = self
self.view.addGestureRecognizer(tapRec)
//where we want to gesture like: view, label etc
}
func handleTap(sender: UITapGestureRecognizer)
{
NSLog("Touch..");
//handling code
}
Ответ 11
Типичный пример 2019 года
Скажем, у вас есть FaceView
, который является своего рода изображением. Их будет много на экране (или в виде коллекции, таблицы, стека или другого списка).
В классе FaceView
вам понадобится переменная "index"
class FaceView: UIView {
var index: Int
так, чтобы каждый FaceView мог осознавать, "какое" лицо находится на экране.
Поэтому вы должны добавить var index: Int
к рассматриваемому классу.
Итак, вы добавляете много FaceView на ваш экран...
let f = FaceView()
f.index = 73
.. you add f to your stack view, screen, or whatever.
Теперь вы добавляете клик для f
p.addGestureRecognizer(UITapGestureRecognizer(target: self,
action: #selector(tapOneOfTheFaces)))
Здесь секрет:
@objc func tapOneOfTheFaces(_ sender: UITapGestureRecognizer) {
if let tapped = sender.view as? CirclePerson {
print("we got it: \(tapped.index)")
Теперь вы знаете, "какое" лицо было нажато в вашей таблице, на экране, в виде стека и т.д.
Это так просто.