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>
Я только что попробовал и заметил такое же поведение. Его вызывают из двух мест, сначала из метода UISlider endTrackingWithTouch: withEvent: (который вызывается методом touchesEnded: withEvent: UIControl), а затем из того же метода touchesEnded: withEvent: UIControl (который сначала вызвал метод endTrakingWithTouch: withEvent:).
Также, когда касание закончилось за пределами ползунка, метод вызывается только один раз методом endTrackingWithTouch: withEvent :. Метод touchesEnded: withEvent: вызывает это, но затем не вызывает обратный вызов, как это было, когда касание завершилось внутри элемента управления.
В любом случае, почему вы подключаете Touch Up Inside? Вы хотите знать, когда пользователь начинает прикасаться к элементу управления, верно? Я думаю, вам следует затем подключить Touch Down вместо Touch Up Inside.
Изменить: я вижу, что вам нужно изменить значение, и это значение, измененное, вызывается слишком часто. Я только что перепроверил тест и заметил следующее. Измененное значение вызывается между двумя внутренними вызовами ретуши. Может, с этим что-нибудь сделаешь?
Поскольку мой предыдущий комментарий не был хорошо принят, я решил придумать простой способ решения проблемы на случай, если кому-то будет интересно.
Я знаю, что это не самый лучший вариант. эффективное решение в мире, но оно работает точно так же.
Я создал два метода: sliderUp и sliderChanged, связанные с TouchUp и ValueChanged соответственно. Я также создал глобальную переменную типа int (timesFired, если хотите), изначально установленную на ноль
. В методе sliderUp я помещаю любой код, который я не возражал, чтобы запустить его дважды. В моем случае я снимаю ползунок обратно вниз, если он не вверху (например, функция сдвига для разблокировки). Я также сбрасываю timeFired обратно на ноль после задержки. чтобы разрешить вызов другого метода. на всякий случай. (performSelector: withObject: afterDelay: если вы не (У меня также есть оператор if, чтобы убедиться, что мой ползунок находится на максимуме), а затем включаю весь код, который я хочу выполнить только один раз, когда ползунок достигает максимального значения. чтобы убедиться, что этот код запускается только один раз, я также увеличиваю timesFired.
Как только пользователь поднимет палец на кнопку, timesFired будет сброшено на ноль, и весь процесс может начаться заново.
Теперь, когда я смогу понять, как «заморозить» ползунок после того, как он переместится наверх, я буду счастлив этим решением. (просто отключение сработает?)
У меня тоже была эта проблема, мой Решением было добавить логическое значение «allowEvent». Затем я подключил UIControlEventTouchDown к функции, которая установила для «allowEvent» значение YES.
В селекторе для UIControlEventTouchUpInside я проверил, имеет ли значение allowEvent значение YES, затем выполните событие и установите для параметра allowEvent значение NO.
Затем событие будет выполняется только один раз, даже если он сработает дважды.
Надеюсь, это поможет!
Я думаю, что самым простым решением является использование упомянутого выше флагового решения.
Я создал флаг под названием (BOOL), нажатый и добавленный к событиям TouchUpInside и TouchDown. Итак, вам просто нужно проверить, нажата ли кнопка == ДА.
// On down event
pressed = YES;
// On up event
if (pressed)
{
pressed = NO;
// code here
}
Надеюсь, это поможет.
Хами
Спасибо вам всем. У меня та же проблема. Вот немного целочисленной математики, которая решает эту проблему для меня:
static UInt32 counter = 0;
counter++;
if((counter/2)*2 != counter) return;
если вы хотите создать подкласс ползунка, вы можете легко решить эту проблему, реализовав endTrackingWithTouch и ничего не делая:
- (void) endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{}
единственное предостережение здесь заключается в том, что некоторые определенные события UIControlEvents не срабатывают должным образом. Я считаю, что это следующие, но я не проводил специального тестирования, чтобы увидеть, какие из них работают, а какие нет. однако изменение касания и подкрашивание внутри определенно работают без дублирования срабатывания.
UIControlEventTouchDragInside = 1 << 2,
UIControlEventTouchDragOutside = 1 << 3,
UIControlEventTouchDragEnter = 1 << 4,
UIControlEventTouchDragExit = 1 << 5,
Простое решение, которое не сломается, если 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;
Просто чтобы он не прерывался с будущими обновлениями
[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
}