Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CommunityОтветов: 2

У меня есть простой 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 и тому подобного? Или я что-то не так сделал?

iphonecocoa-touchuikituibutton

Ответы

Ответ 1 · рейтинг 2 · Community

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

Ответ 2 · рейтинг 2 · iKenndac

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы