Странное поведение UIButton: это нормально?

У меня есть простой UIButton, и я хочу что-то делать, когда пользователь прикасается к нему, но затем перемещает палец за пределы кнопки и не касается экрана. Похоже, мне нужно прослушать событие 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 и тому подобного? Или я что-то не так сделал?


person Community    schedule 19.08.2009    source источник


Ответы (2)


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

person Community    schedule 19.08.2009

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

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

person iKenndac    schedule 19.08.2009
comment
хорошо, это из-за удобства использования ... Мне просто интересно, почему эта область такая невероятно огромная ;-) - person ; 19.08.2009
comment
У людей пальцы толще, чем вы думаете, к тому же они тупее. - person Corey Floyd; 20.08.2009