UIButton отложенное изменение состояния - PullRequest
19 голосов
/ 25 апреля 2009

У меня есть UIButton подпредставление внутри UITableViewCell.

При касании этой кнопки пользователь должен удерживать кнопку примерно полсекунды, чтобы изображение кнопки изменилось на UIControlStateHighlighted.

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

Почему это происходит и как я могу это исправить?

Ответы [ 5 ]

25 голосов
/ 29 ноября 2011

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

Теперь это можно исправить, отключив delaysContentTouches или сняв флажок «Задержки касания содержимого» в табличном представлении.

Единственный отрицательный побочный эффект заключается в том, что пользователь не сможет нажать кнопку и инициировать жест прокрутки. Однако, если пользователь пытается прокрутить, начиная с любой точки, которая сама не принимает касания, поведение должно быть таким же, как и раньше.

11 голосов
/ 22 декабря 2012

Ответ на вопрос Дэвида Ходжа.

Я просто хочу добавить способ удалить этот «единственный отрицательный побочный эффект», уже описанный Дэвидом: если вы начнете прокручивать внутри UIcontrol в UIScrollView с delayContentTouches = NO, прокрутка не работает.

РЕШЕНИЕ Подкласс UIScrollView (или UITableView в качестве исходного вопроса) и переопределение:

-(BOOL) touchesShouldCancelInContentView:(UIView *)view {   
return YES; 
}

Ваш UIControls внутри UIScrollView / UITableView сразу же изменит свое состояние при нажатии, и просмотры прокрутки смогут прокручиваться, даже если касание запускается на каком-то UIControl. Работает как шарм.

10 голосов
/ 31 декабря 2009

Проблема в том, что ваша UIButton находится внутри UITableView. Это означает, что табличное представление должно определить, будет ли ваше касание ударным или это просто касание, предназначенное для кнопки. Табличное представление должно отложить отправку сообщения на UIButton до тех пор, пока оно не узнает, что пользователь не намеревается провести пальцем, и поэтому прокручивает представление вместо нажатия кнопки.

Если вам не нужно табличное представление, избавьтесь от UITableView.

3 голосов
/ 23 апреля 2010

Я просто изменяю изображение в методе целевого действия:

[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal];

Мгновенно меняет фоновое изображение.

0 голосов
/ 26 апреля 2009

Редактировать: полностью переписано после неправильного понимания вопроса

Одним из способов мышления UIButton является краткий способ задания области экрана, которая может реагировать на различные мгновенные сенсорные события, ответ на которые он определяет, определяется системой Target-Action UIControl для доставки сообщений другим объектам.

UIControlEventTouchDown звучит как тот, на который вам нужно ответить. Она сработает, как только кто-то коснется вашей кнопки - это то, что делает кнопка «Контактная информация» в SMS.

UIButton * myButton = [[UIButton buttonWithType: UIButtonTypeRoundedRect]; // Подбор заголовка, фрейма и т. Д. [myButton addTarget: self action: @selector (myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView: myButton];

Отправит сообщение -(void)myButtonWasPressed объекту, с которого запускается этот код (в идеале вы просматриваете контроллер). В myButtonWasPressed вы можете добавить новый вид или выполнить любое действие, которое вам нравится. Приложение SMS выдвигает контроллер представления для отображения контактной информации с помощью контроллера навигации.

Если это по-прежнему не решит вашу проблему, вам придется опубликовать некоторый код, чтобы лучше понять, что происходит не так.

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