Странное поведение UIButton: это нормально? - PullRequest
1 голос
/ 19 августа 2009

У меня есть простая кнопка UIB, и я хочу что-то сделать, когда пользователь дотрагивается до нее, но затем перемещает палец за пределы кнопки и не касается экрана. Похоже, мне нужно прослушать событие UIControlEventTouchUpOutside.

В моем контроллере представления я сделал это:

UIButton *bt = [[UIButton alloc] initWithFrame:rect];
[bt setBackgroundColor:[UIColor whiteColor]];
[bt addTarget:self action:@selector(onTouchUpOutside) forControlEvents:UIControlEventTouchUpOutside];
[self.view addSubview:bt];

и соответствующий метод действия:

- (void)onTouchUpOutside {
    NSLog(@"touchUpOutside");
}

Теперь угадайте, что? Я касаюсь кнопки, затем перетаскиваю палец за ее пределы, не касаюсь экрана, и сообщение не регистрируется. В самом деле, мне было бы зарегистрировано, что произошло событие UIControlEventTouchUpInside, даже если мой палец не находится над кнопкой. Кажется, что я могу перемещать палец примерно на 150% ширины и высоты вокруг этой кнопки при прикосновении, и это скажет мне, что палец был в кнопке, когда я не касался. Но когда я перемещаю его очень далеко (= достаточно далеко), я получаю это сообщение "touchUpOutside". Так это просто очередное безумие от Apple, вроде задержки в -touchesMoved и тому подобного? Или я что-то не так сделал?

Ответы [ 2 ]

2 голосов
/ 19 августа 2009

touchUpInside срабатывает, когда вы немного перемещаете палец за пределы кнопки, потому что у людей большие неточные пальцы.

Если вы действительно хотите переопределить это поведение, в обработчике touchUpInside проверьте местоположение касания, а затем вызовите обработчик touchUpOutside напрямую, если касание его за пределами bounds кнопки.

2 голосов
/ 19 августа 2009

Я понял, что это нормальное поведение UIKit. Странно, но нормально. Пользователь должен отодвинуть палец достаточно далеко, чтобы «отменить» касание. Если палец находится недостаточно далеко от нажатой кнопки и подъемника, то запускается событие touchUpInside. Не удалось найти текст от Apple, говорящий об этом, но я несколько раз тестировал в нескольких проектах, включая совершенно новый с простым UIButton и IBAction. Также некоторый пример кода от apple показывает то же самое странное поведение.

...