tap gesture recognizer-какой объект был нажат?
Я новичок в распознавателях жестов, поэтому, возможно, этот вопрос звучит глупо: я назначаю распознаватели жестов tap куче 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];
}
10 ответов
определите целевой селектор (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.
}
Это был год, задавая этот вопрос, но все же для кого-то.
при объявлении 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
}
}
вот обновление для Swift 3 и дополнение к ответу Мани. Я бы предложил использовать sender.view
в сочетании с тегированием UIViews (или других элементов, в зависимости от того, что вы пытаетесь отслеживать) Для несколько более "продвинутого" подхода.
- добавление UITapGestureRecognizer, например, в UIButton (вы можете добавить это в UIViews и т. д. также) или целая куча элементов в массиве с for-loop и вторым массивом для крана жесты.
let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction))
yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
-
определение функции в том же testController (это имя вашего контроллера представления). Мы собираемся использовать теги здесь - теги-это идентификаторы Int, которые вы можете добавить в свой UIView с помощью
yourButton.tag = 1
. Если у вас есть динамический список элементов, таких как массив, вы можете сделать for-loop, который повторяет Ваш массив и добавляет тег, который увеличивается постепенноfunc yourFunction(_ sender: AnyObject) { let yourTag = sender.view!.tag // this is the tag of your gesture's 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; может быть полезно для списков миниатюр + кнопок и т. д.
используйте этот код в 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
}
}
}
можно использовать
- (void)highlightLetter:(UITapGestureRecognizer*)sender {
UIView *view = sender.view;
NSLog(@"%d", view.tag);
}
view будет объектом, в котором жест крана был распознан
вы также можете использовать метод "shouldReceiveTouch" UIGestureRecognizer
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch: (UITouch *)touch {
UIView *view = touch.view;
NSLog(@"%d", view.tag);
}
Не забудьте установить делегат вашего распознавателя жестов.
в swift это довольно просто
напишите этот код в функции ViewDidLoad ()
let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
tap.numberOfTapsRequired = 2
tapView.addGestureRecognizer(tap)
часть обработчика это может быть в viewDidLoad или вне viewDidLoad, тесто помещается в расширение
@objc func tapHandler(gesture: UITapGestureRecognizer) {
currentGestureStates.text = "Double Tap"
}
здесь я просто проверяю код вывода если вы хотите сделать действие вы можете делать все что угодно или еще потренируйтесь и читайте
вы должны изменить создание распознавателя жестов, чтобы принять параметр (добавить двоеточие':')
UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];
и в методе highlightLetter: вы можете открыть панель прикреплена к устройства:
-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
UIView *view = [recognizer view];
}
Если вы добавляете разные UIGestureRecognizer
по-разному UIView
s и хотите отличить в методе действия, то вы можете проверить представление свойства в параметре sender, который даст вам представление sender.
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
}