События UISlider

Я использую UISlider, он обновляется автоматически, за исключением того, что пользователь касается кнопки ползунка. поэтому я сделал это в функции, которая автоматически обновляется NSTimer:

if (!isSliderTouched) {
    [progressSlider setValue: progressValue];
}

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

РЕДАКТИРОВАТЬ: это должен быть сюжет:

  1. пользователь начинает перетаскивать / касаться UISlider => isSliderTouched = YES
  2. пользователь отпускает / отключает UISlider => isSliderTouched = NO

Решение:

UIControlEventTouchDown
UIControlEventTouchUpInside
[progressSlider addTarget:self action:@selector(sliderMoveStart) forControlEvents:UIControlEventTouchDown];

ура Эндо


person endo.anaconda    schedule 12.01.2011    source источник
comment
Я читал это несколько раз, но до сих пор не понимаю, чего вы хотите. Но TouchUpInside - это событие, которое вы слушаете, чтобы определить, когда пользователь поднимает палец.   -  person madmik3    schedule 12.01.2011
comment
Я попытался объяснить это получше, см. обновление   -  person endo.anaconda    schedule 12.01.2011
comment
TouchUpInSide вызывается дважды :(   -  person AsifHabib    schedule 28.11.2013


Ответы (4)


Ты можешь использовать:

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

для обнаружения событий touchDown и touchUp. Вы можете установить свой флаг соответствующим образом.

Я предполагаю из вашего фрагмента кода, что вы используете UISlider в качестве индикатора выполнения. Рассматривали ли вы вместо этого использование UIProgressView?

person pwc    schedule 12.01.2011
comment
спасибо, за подсказку. UIProgressView не имеет кнопки для скольжения, так что это не то, что мне нужно - person endo.anaconda; 12.01.2011
comment
непрерывный параметр - это то, что вам нужно developer.apple.com/library/ios/documentation/uikit/reference/ - person serhats; 15.12.2012
comment
Не уверен в правилах SO, просто хотел указать вам, ребята, что есть лучший способ сделать это для элементов управления UISlider. Смотрите мой ответ. - person Geebs; 18.08.2013

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

if (!progressSlider.highlighted) {
    [progressSlider setValue: progressValue];
}
person Geebs    schedule 09.03.2013
comment
Несколько человек по какой-то причине проголосовали против этого. Возможно, мне следовало объяснить лучше: объекты UISlider имеют выделенное свойство, которое имеет значение ДА, когда ползунок касается / перетаскивается. Вы можете использовать это напрямую, чтобы понять, когда обновлять значение, а когда нет. Если кто-то хочет проголосовать против, дайте мне знать, что вы думаете не так с ответом :) - person Geebs; 26.10.2013
comment
Мне показалось, что этот метод определяет, когда ползунок был впервые нажат, а не когда он был отпущен. - person Max Strater; 04.11.2013
comment
Макс, он фактически дает состояние (прикосновение или отсутствие прикосновения), а не обнаружение событий нажатия или отпускания. Человек, задающий вопрос, хотел установить isSliderTouched на основе начальных / конечных событий. Я предполагаю, что он может просто использовать выделенное свойство вместо создания isSliderTouched и определения начала и конца касания. - person Geebs; 14.12.2013
comment
Я разрабатываю настраиваемый аудиоплеер, используя UISlider в качестве средства контроля. И это именно то, что мне нужно. Это элегантно. Большое спасибо! - person Oliver Zhang; 06.04.2017

Лучший способ отслеживать, завершил ли пользователь взаимодействие с UISlider, - использовать непрерывный флаг.

Если вы хотите запускать действие ползунка только после того, как действие завершено и пользователь убрал палец с него, используйте

[blurSlider  addTarget:self action:@selector(blurSliderChanged) forControlEvents:UIControlEventValueChanged];
    blurSlider.continuous = NO;

В противном случае по умолчанию установлено ДА.

[blurSlider  addTarget:self action:@selector(blurSliderChanged) forControlEvents:UIControlEventValueChanged];
    blurSlider.continuous = YES;
person Sam B    schedule 05.10.2013

когда пользователь касается ползунка, вы можете установить флаг логической переменной и сделать его НЕТ. и в методе обновления проверьте, установлен ли флаг ДА или НЕТ.

person Robin    schedule 12.01.2011
comment
я думаю, вы меня неправильно поняли. Я хочу, чтобы пользователь мог использовать ползунок, но не чтобы процесс автоматического обновления выполнял обновление, пока пользователь его использует. - person endo.anaconda; 12.01.2011
comment
чем вам нужно использовать метод valueChanged или функцию, которая будет запускать функцию, подключенную к valueChanged - person Robin; 12.01.2011
comment
нет, когда пользователь коснулся кнопки, но не двигается. следует автоматическое обновление. - person endo.anaconda; 12.01.2011
comment
чем при касании ползунка вы можете установить флаг логической переменной и сделать его НЕТ. и в методе обновления проверьте, установлен ли флаг ДА или НЕТ. - person Robin; 12.01.2011