2009-04-25 7 views
19

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

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

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

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

+0

Из любопытства, это в Симуляторе или на устройстве? –

ответ

0

Edit: полностью переписано после непонимания вопроса

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

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

UIButton * myButton = [[кнопка UIButtonWithType: UIButtonTypeRoundedRect]; // SEt up title, frame etc [myButton addTarget: self action: @selector (myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView: myButton];

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

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

+0

Я думаю, вы неправильно поняли. Если вы посмотрите на приложение SMS, например, значки в верхней части потока сообщений мгновенно реагируют на касания. Я говорю, что мои кнопки не показывают мгновенной реакции на выделенное состояние. Я не хочу, чтобы пользователь удерживал кнопку. Я хочу, чтобы они использовали кнопку обычно, но изменили состояние кнопки и отразили визуальный внешний вид кнопки, как и ожидалось. – 2009-04-26 02:40:24

+0

Хорошо, все еще недоразумение :). Нет ничего плохого в действиях или событиях на моей кнопке. Чтобы воссоздать то, что я описываю, просто создайте новый UITableViewCell и добавьте UIButton в качестве подзадачи: i.e [cell.contentView addSubview: button]. Затем проверьте его на устройстве. Когда вы прикасаетесь к кнопке, действие срабатывает правильно, однако выделенное состояние кнопки не происходит немедленно. Скорее, вы должны удерживать кнопку нажатой в течение половины секунды, прежде чем вы увидите кнопку * визуально * изменить состояние. Все, о чем я говорю, это внешний вид кнопки. – 2009-04-28 09:32:46

10

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

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

+0

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

3

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

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

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

+0

он работает, спасибо! –

25

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

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

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

+0

Я потратил, вероятно, 8 часов, пытаясь найти решение для этого. Огромное спасибо. – maxhud

+0

У меня была такая же проблема с UIButton на scrollview. Это фиксировало это. –

+0

Это работает для меня, спасибо. –

10

Для ответа Дэвида Ходжа.

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

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

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

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

+0

Никогда не называется. –

Смежные вопросы