UISlider возвращает два события Touch Up Inside, почему это происходит?

word-break:break-all:

слово для продолжения границы, а затем для перехода на новую строку.

word-wrap:break-word:

Сначала перенос слов в новой строке, а затем переход к границе.

Пример:

div {
   border: 1px solid red;
   width: 200px;
}

span {
  background-color: yellow;
}

.break-all {
  word-break:break-all;
 }
.break-word {
  word-wrap:break-word;  
}
<b>word-break:break-all</b>

<div class="break-all">
  This text is styled with
  <span>soooooooooooooooooooooooooome</span> of the text
  formatting properties.
</div>

<b> word-wrap:break-word</b>

<div class="break-word">
  This text is styled with
  <span>soooooooooooooooooooooooooome</span> of the text
  formatting properties.
</div>
6
задан willc2 30 June 2009 в 11:33
поделиться

8 ответов

Я только что попробовал и заметил такое же поведение. Его вызывают из двух мест, сначала из метода UISlider endTrackingWithTouch: withEvent: (который вызывается методом touchesEnded: withEvent: UIControl), а затем из того же метода touchesEnded: withEvent: UIControl (который сначала вызвал метод endTrakingWithTouch: withEvent:).

Также, когда касание закончилось за пределами ползунка, метод вызывается только один раз методом endTrackingWithTouch: withEvent :. Метод touchesEnded: withEvent: вызывает это, но затем не вызывает обратный вызов, как это было, когда касание завершилось внутри элемента управления.

В любом случае, почему вы подключаете Touch Up Inside? Вы хотите знать, когда пользователь начинает прикасаться к элементу управления, верно? Я думаю, вам следует затем подключить Touch Down вместо Touch Up Inside.

Изменить: я вижу, что вам нужно изменить значение, и это значение, измененное, вызывается слишком часто. Я только что перепроверил тест и заметил следующее. Измененное значение вызывается между двумя внутренними вызовами ретуши. Может, с этим что-нибудь сделаешь?

0
ответ дан 10 December 2019 в 00:42
поделиться

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

Я знаю, что это не самый лучший вариант. эффективное решение в мире, но оно работает точно так же.

Я создал два метода: sliderUp и sliderChanged, связанные с TouchUp и ValueChanged соответственно. Я также создал глобальную переменную типа int (timesFired, если хотите), изначально установленную на ноль

. В методе sliderUp я помещаю любой код, который я не возражал, чтобы запустить его дважды. В моем случае я снимаю ползунок обратно вниз, если он не вверху (например, функция сдвига для разблокировки). Я также сбрасываю timeFired обратно на ноль после задержки. чтобы разрешить вызов другого метода. на всякий случай. (performSelector: withObject: afterDelay: если вы не (У меня также есть оператор if, чтобы убедиться, что мой ползунок находится на максимуме), а затем включаю весь код, который я хочу выполнить только один раз, когда ползунок достигает максимального значения. чтобы убедиться, что этот код запускается только один раз, я также увеличиваю timesFired.

Как только пользователь поднимет палец на кнопку, timesFired будет сброшено на ноль, и весь процесс может начаться заново.

Теперь, когда я смогу понять, как «заморозить» ползунок после того, как он переместится наверх, я буду счастлив этим решением. (просто отключение сработает?)

0
ответ дан 10 December 2019 в 00:42
поделиться

У меня тоже была эта проблема, мой Решением было добавить логическое значение «allowEvent». Затем я подключил UIControlEventTouchDown к функции, которая установила для «allowEvent» значение YES.

В селекторе для UIControlEventTouchUpInside я проверил, имеет ли значение allowEvent значение YES, затем выполните событие и установите для параметра allowEvent значение NO.

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

Надеюсь, это поможет!

1
ответ дан 10 December 2019 в 00:42
поделиться

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

Я создал флаг под названием (BOOL), нажатый и добавленный к событиям TouchUpInside и TouchDown. Итак, вам просто нужно проверить, нажата ли кнопка == ДА.

// On down event
pressed = YES;

// On up event
if (pressed)
{
  pressed = NO;
  // code here

}

Надеюсь, это поможет.

Хами

1
ответ дан 10 December 2019 в 00:42
поделиться

Спасибо вам всем. У меня та же проблема. Вот немного целочисленной математики, которая решает эту проблему для меня:

    static UInt32 counter = 0;

counter++;

if((counter/2)*2 != counter) return;
1
ответ дан 10 December 2019 в 00:42
поделиться

если вы хотите создать подкласс ползунка, вы можете легко решить эту проблему, реализовав endTrackingWithTouch и ничего не делая:

- (void) endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{}

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

   UIControlEventTouchDragInside     = 1 <<  2,
   UIControlEventTouchDragOutside    = 1 <<  3,
   UIControlEventTouchDragEnter      = 1 <<  4,
   UIControlEventTouchDragExit       = 1 <<  5,
2
ответ дан 10 December 2019 в 00:42
поделиться

Простое решение, которое не сломается, если Apple исправит эту ... функцию (?) в будущем. это добавить свойство, которое хранит время с момента последнего взаимодействия. и выходить, если прошло невозможно мало времени с момента последнего взаимодействия.

(в коде ниже, latestTimeMark, первоначально устанавливается на текущее время в viewDidLoad)

NSDate *now = [NSDate date];
 double nowDouble = [now timeIntervalSince1970];
 double difference = nowDouble - self.latestTimeMark;
 self.latestTimeMark = nowDouble;
 //NSLog(@"difference is now: %f", difference);
 if(difference<0.01f) return;
-1
ответ дан 10 December 2019 в 00:42
поделиться

Просто чтобы он не прерывался с будущими обновлениями

[customSlider addTarget:self action:@selector(sliderDown:) forControlEvents:UIControlEventTouchDown];

[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventTouchUpInside];



- (void)sliderDown:(id)sender
{

    sliderused = NO;

}

- (void)sliderAction:(id)sender
{
    if(sliderused){
    return;
}

sliderused = YES;

//Your Code Here
}
6
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: