Почему порядок выполнения касаний Begin, target-action и touchesEnded меняется с помощью быстрых касаний UIButton? - PullRequest
2 голосов
/ 31 января 2011

ОБНОВЛЕНИЕ: С оттенком стыда я обнаружил, что приказ не имеет никакого отношения к скорости постукивания. Я вызывал визуальный код перед вызовом super touchesEnded: withEvent, поэтому, если вы нажали действительно быстро, на дисплее никогда не будет возможности нарисовать подсвеченное состояние, прежде чем его снова закроют. Поскольку код, который фактически вызывал блокировку основного потока всего за несколько миллисекунд, выделенное состояние будет оставаться видимым до тех пор, пока основной поток не разблокируется снова, а если вы нажали действительно быстро, это выглядело так, как будто ничего не произошло вообще. Перемещение супер-вызова к вершине переопределенного метода исправило все это. Извините, если модератор увидит это сообщение, его можно удалить. позор

Эту проблему, должно быть, 1000 раз задавали в SO, но я не могу найти объяснение, соответствующее моей конкретной проблеме.

У меня есть подкласс UIButton с нестандартным дизайном. Конечно, дизайн достаточно индивидуален, поэтому я не могу просто использовать обычные setSomething:forControlState: методы. Мне нужен другой цвет фона на ощупь, например, и некоторые значки, которые должны мигать.

Чтобы реализовать эти изменения представления, я (нелогично) поместил код дисплея в (A) touchesBegan:withEvent и (Z) touchesEnded:withEvent:, прежде чем вызывать их соответствующие супер методы. Кажется странным, но работает как задумано, или так сначала показалось.

После того, как реализация addTarget:action:forControlEvents была использована для привязки UIControlEventTouchUpInside к методу (X) itemTapped:, я ожидаю, что эти методы всегда будут запускаться в порядке (A) (X) (Z). Однако, если вы нажмете на экран очень быстро (или мышь в симуляторе), они будут срабатывать в порядке (A) (Z) (X). Где (A) и (Z) следуют друг за другом в такой быстрой последовательности, что вся визуальная обратная связь для постукивания невидима. Это нежелательное поведение. Это также не может быть подходом, так как многие приложения требуют одинакового поведения, верно?

Так что мой вопрос к вам: что я делаю не так? Одна вещь, которую я предполагаю, состоит в том, что внешний вид кнопок не должен изменяться в touchesBegan:withEvent и touchesEnded:withEvent, но тогда где? Или я упускаю какой-то другой известный факт?

Спасибо за толчок, Эрик-Поль.

1 Ответ

4 голосов
/ 31 января 2011

Я не знаю, почему порядок отличается, но вот два предложения, которые помогут с этим справиться.

Какие визуальные изменения вы вносите в кнопку?Если это такие вещи, как изменение заголовка / изображения / фонового изображения, вы можете сделать все это, изменив выделенное состояние кнопки.Вы можете установить несколько свойств, таких как заголовок и фоновое изображение для каждого штата.Когда пользователь нажимает на кнопку, состояние highlighted включается, поэтому любые изменения, внесенные в это состояние, будут видны в это время.Обратите внимание, что если вы используете состояние selected на кнопке, вам также необходимо настроить внешний вид для UIControlStateHighlighted|UIControlStateSelected, в противном случае он по умолчанию вернется к наследованию от Normal, когда оба выделены и выбраны

Другое предложение состоит в том, чтобы отказаться от touchesBegan:withEvent: и touchesEnded:withEvent: и переключиться на использование методов, унаследованных от UIControl, а именно beginTrackingWithTouch:withEvent: и endTrackingWithTouch:withEvent:.Вы также можете реализовать continueTrackingWithTouch:withEvent: и использовать свойство touchInside, чтобы отключить визуальные изменения, если касание покидает элемент управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...