У меня есть UIScrollView
только горизонтальная прокрутка, и я хотел бы знать, в каком направлении (влево, вправо) пользователь прокручивает. Что я сделал, так это UIScrollView
переопределил и переопределил touchesMoved
метод:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
float now = [touch locationInView:self].x;
float before = [touch previousLocationInView:self].x;
NSLog(@"%f %f", before, now);
if (now > before){
right = NO;
NSLog(@"LEFT");
}
else{
right = YES;
NSLog(@"RIGHT");
}
}
Но этот метод иногда вообще не вызывается, когда я двигаюсь. Что вы думаете?
iphone
ios
cocoa-touch
uiscrollview
Alex1987
источник
источник
Ответы:
Определить направление довольно просто, но имейте в виду, что направление может изменяться несколько раз в течение жеста. Например, если у вас есть представление прокрутки с включенной подкачкой и пользователь проводит пальцем, чтобы перейти на следующую страницу, начальное направление может быть вправо, но если у вас включен отскок, он на короткое время вообще не будет двигаться и затем кратко идти влево.
Чтобы определить направление, вам нужно будет использовать
UIScrollView scrollViewDidScroll
делегата. В этом примере я создал переменную с именемlastContentOffset
которую я использую для сравнения текущего смещения содержимого с предыдущим. Если оно больше, то scrollView прокручивается вправо. Если это меньше, тогда scrollView прокручивает влево:Я использую следующее перечисление, чтобы определить направление. Установка первого значения в ScrollDirectionNone имеет дополнительное преимущество, заключающееся в том, что это направление по умолчанию используется при инициализации переменных:
источник
lastContentOffset = scrollView.contentOffset.x;
lastContentOffset
тип. Относительно свойства против статических переменных: любое решение является хорошим выбором. У меня нет никаких реальных предпочтений. Это хороший момент.В этом случае на iOS 5 и выше используйте,
UIScrollViewDelegate
чтобы определить направление жеста панорамирования пользователя:источник
Использование
scrollViewDidScroll:
- хороший способ найти текущее направление.Если вы хотите узнать направление после того, как пользователь закончил прокрутку, используйте следующее:
источник
Нет необходимости добавлять дополнительную переменную, чтобы отслеживать это. Просто используйте свойство
UIScrollView
spanGestureRecognizer
вот так. К сожалению, это работает, только если скорость не равна 0:Вы можете использовать комбинацию компонентов x и y для обнаружения вверх, вниз, влево и вправо.
источник
Решение
источник
velocityInView
вместоtranslationInView
. Это решает проблему, возникающую при смене направления при одном и том же движении.Свифт 4:
Для горизонтальной прокрутки вы можете просто сделать:
Для вертикальной прокрутки изменить
.x
с.y
источник
В iOS8 Swift я использовал этот метод:
У меня есть динамическое представление, которое меняет местоположения при прокрутке пользователя, поэтому представление может показаться, что оно осталось на том же месте на экране. Я также отслеживаю, когда пользователь идет вверх или вниз.
Вот также альтернативный способ:
источник
crollViewDidEndDecelerating
праве?Вот что у меня получилось (в Objective-C):
источник
источник
В качестве альтернативы можно наблюдать ключевой путь «contentOffset». Это полезно, когда вы не можете установить / изменить делегата представления прокрутки.
После добавления наблюдателя вы можете теперь:
Не забудьте удалить наблюдателя при необходимости. Например, вы можете добавить наблюдателя в viewWillAppear и удалить его в viewWillDisappear
источник
В скором времени:
Вы можете сделать это также в scrollViewDidScroll.
источник
Вот мое решение для поведения, как в ответе @followben, но без потерь при медленном старте (когда dy равно 0)
источник
Я проверил некоторые из ответов и подробно остановился на ответе AnswerBot, обернув все в одну каплю в категории UIScrollView. Вместо этого lastContentOffset сохраняется внутри uiscrollview, а затем просто вызывается:
Исходный код на https://github.com/tehjord/UIScrollViewScrollingDirection
источник
Я предпочитаю делать фильтрацию, основываясь на ответе @ memmons
В Objective-C:
При тестировании в
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
:self.lastContentOffset
меняется очень быстро, разрыв в значениях составляет почти 0.5f.Это не обязательно.
И иногда, когда обращаются в точном состоянии, ваша ориентация может потеряться. (операторы реализации иногда пропускаются)
Такие как :
В Swift 4:
источник
Когда подкачка включена, вы можете использовать этот код.
источник
Коды объясняются, я думаю. CGFloat разница1 и разница2 объявлены в частном интерфейсе того же класса. Хорошо, если contentSize остается прежним.
источник
Итак, для меня эта реализация работает очень хорошо:
Так что это будет запускать textView, чтобы закрыть после окончания перетаскивания.
источник
Используйте этот метод делегата scrollview.
Если y-координата скорости + ve, просмотр прокрутки прокручивается вниз, а если -ve - прокрутка прокручивается вверх. Аналогично, левая и правая прокрутка могут быть обнаружены с использованием координаты х.
источник
Short & Easy будет, просто проверьте значение скорости, если оно больше нуля, то прокрутка влево или вправо:
источник
Если вы работаете с UIScrollView и UIPageControl, этот метод также изменит представление страницы PageControl.
Спасибо @Esq's Swift код.
источник
Swift 2.2 Простое решение, которое отслеживает одно и несколько направлений без потерь.
источник
Во всех верхних ответах используются два основных способа решения проблемы:
panGestureRecognizer
илиcontentOffset
. Оба метода имеют свои плюсы и минусы.Способ 1: panGestureRecognizer
Когда вы используете
panGestureRecognizer
то, что предлагает @followben, если вы не хотите программно прокручивать представление прокрутки, оно работает правильно.Cons
Но если вы переместите представление прокрутки со следующим кодом, верхний код не сможет его распознать:
Способ 2: contentOffset
Cons
Если вы хотите изменить contentOffset программно, во время прокрутки (например, когда вы хотите создать бесконечную прокрутку), этот метод создает проблему, потому что вы можете изменить
contentOffset
во время смены мест просмотра контента и в это время верхний код переместится при прокрутке вправо или осталось.источник
Ответ от Mos6y https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004
источник