UIButton TouchUpInside Расположение касания

Итак, у меня есть большой UIButton, это UIButtonTypeCustom, а цель кнопки вызывается для UIControlEventTouchUpInside. Мой вопрос, как я могу определить, где в UIButton произошло касание. Мне нужна эта информация, чтобы я мог отображать всплывающее окно из сенсорного местоположения. Вот что я пробовал:

UITouch *theTouch = [touches anyObject];
CGPoint where = [theTouch locationInView:self];
NSLog(@" touch at (%3.2f, %3.2f)", where.x, where.y);

и различные другие итерации. Целевой метод кнопки получает от нее информацию через sender:

    UIButton *button = sender;

Итак, могу ли я использовать что-то вроде: button.touchUpLocation?

Искал в инете, ничего похожего не нашел, заранее спасибо.


person Andrew    schedule 10.09.2011    source источник
comment
TouchUpLocation отсутствует, UIButton — это элемент управления, вы не можете получить местоположение щелчка UIButton. developer.apple.com/library/ios /#ДОКУМЕНТАЦИЯ/UIKit/Справочник/   -  person Praveen-K    schedule 11.09.2011
comment
Я не имел в виду буквально touchUpLocation, я имел в виду что-то вроде этого   -  person Andrew    schedule 11.09.2011
comment
@ Правин-К, это неправильно. UIKit поддерживает действия, которые принимают второй параметр, UIEvent, который запускает действие. Отсюда вы можете получить список касаний, и у каждого касания есть место. Смотрите код, который я разместил ниже. Однако это правда, что UIButton не имеет метода, который возвращает местоположение последнего щелчка.   -  person Caleb    schedule 11.09.2011


Ответы (2)


UITouch *theTouch = [touches anyObject];
CGPoint where = [theTouch locationInView:self];
NSLog(@" touch at (%3.2f, %3.2f)", where.x, where.y);

Это правильная идея, за исключением того, что этот код, вероятно, находится внутри действия в вашем контроллере представления, верно? Если это так, то self относится к контроллеру представления, а не к кнопке. Вы должны передать указатель на кнопку в -locationInView:.

Вот проверенное действие, которое вы можете попробовать в своем контроллере представления:

- (IBAction)buttonPressed:(id)sender forEvent:(UIEvent*)event
{
    UIView *button = (UIView *)sender;
    UITouch *touch = [[event touchesForView:button] anyObject];
    CGPoint location = [touch locationInView:button];
    NSLog(@"Location in button: %f, %f", location.x, location.y);
}
person Caleb    schedule 11.09.2011
comment
Спасибо, что полностью решили мою проблему. Я думал, что это невозможно сделать, так что это здорово. - person Andrew; 11.09.2011
comment
Какой отличный фрагмент кода - иногда появляются такие вещи, которые подтверждают вашу веру в человеческую природу :-) - person SomaMan; 02.03.2012
comment
Есть ли способ получить событие от - (IBAction) buttonPressed: (id) sender...? (То есть у меня огромный проект и я бы хотел это узкое место, не меняя все кнопки на ...forEvent:, если получится.) Спасибо! - person Olie; 08.11.2013
comment
@Olie Насколько я знаю, если вам нужно событие, вам нужно изменить подпись действия, чтобы включить параметр события. - person Caleb; 08.11.2013
comment
но если вы получили несколько касаний, это не продвинет вас дальше - person Peter Lapisu; 11.12.2013
comment
@PeterLapisu Конечно, да. Смысл ответа в том, что OP нужно было указать кнопку, а не self в вызове -locationInView:. Я использовал -anyObject, потому что это то, что использовал OP, но ничто не мешает вам смотреть на каждое касание в наборе касаний: NSSet *touches = [event touchesForView:button]; for (UITouch *t in touches) {CGPoint p = [t locationInView:button]; ...}. Но, опять же, вопрос ОП не в том, как обрабатывать несколько касаний. - person Caleb; 11.12.2013
comment
Большой! Этот ответ сэкономил мне много времени! Кстати, если вам нужно местоположение в контроллере представления, которому принадлежит кнопка, вы можете: CGPoint location = [touch locationInView:self.view]; или что-то - person inix; 20.04.2016

Для Swift 3.0:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) 
{
       let myButton:UIButton = sender as! UIButton
       let touches: Set<UITouch>? = event.touches(for: myButton)
       let touch: UITouch? = touches?.first
       let touchPoint: CGPoint? = touch?.location(in: myButton)
       print("touchPoint\(touchPoint)")  
}
person Ammar Mujeeb    schedule 27.03.2017