Ответ 1
Спасибо, Крис. Это то, что сработало для меня, наконец:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// Detect the scroll direction
if (lastContentOffset < (int)scrollView.contentOffset.x) {
...
}
}
Я сделал google достаточно, и я сделал проверку сообщений, подобных этим (Поиск направления прокрутки в UIScrollView?) в stackoverflow перед публикацией этого. У меня есть динамическое количество фотографий в приложении iPhone, которое отображается через UIScrollView
. В любой момент времени в окне прокрутки отображается только 3 фотографии. Когда у меня есть, скажем, 4 фотографии, всего:
1-я фотография: отображается со смещением 0.0
2-я фотография: отображается со смещением 320,0
Третья фотография: отображается со смещением 640.0
Теперь, когда пользователь прокручивается до 4-й фотографии, вид прокрутки сбрасывается до 0,0 смещения. Если пользователь пытается прокрутить "за" 4-ю фотографию, прокрутка должна останавливаться только вправо (чтобы пользователь не прокручивал "за" ). Но в настоящее время пользователь "может" прокручиваться за пределы последней фотографии; однако я обнаруживаю это программно и reset смещение. Но он не выглядит аккуратным, так как пользователь мгновенно видит черный фон. Я хочу обнаружить, что пользователь начал прокручивать "право" (помните, что прокрутка "влево", т.е. на "предыдущую" фотографию в порядке) в scrollViewWillBeginDragging
, так что я могу остановить дальнейшую прокрутку вправо.
Что я пробовал:
self.scrollView.panGestureRecognizer
translationInView
не работает, потому что нет
panGestureRecognizer
экземпляр, возвращенный в первую очередь (!),
хотя API UIScrollView утверждает это.scrollViewDidEndDecelerating
возможно, хотя
это не будет служить моей цели.Спасибо, Крис. Это то, что сработало для меня, наконец:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// Detect the scroll direction
if (lastContentOffset < (int)scrollView.contentOffset.x) {
...
}
}
У меня не было проблем, определяющих направление в scrollViewWillBeginDragging
при проверке прокрутки panGestureRecognizer
:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];
if(translation.y > 0)
{
// react to dragging down
} else
{
// react to dragging up
}
}
Мне было очень полезно отменять прокрутку при первом перемещении перетаскивания, когда пользователь перетаскивает в запрещенном направлении.
Для быстрых 2.0+ и ios 8.0 +
func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview)
if (actualPosition.y > 0){
// Dragging down
}else{
// Dragging up
}
}
Это то, что я использовал, и он работает, по крайней мере, на iOS 6.0:
- (void)scrollViewDidScroll:(UIScrollView*)scrollView
{
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView];
// Detect direction by accessing x or y of translation
}
Сохраняет переменную экземпляра для lastContentOffset
...
Решение Swift 3
1- Добавить UIScrollViewDelegate
2- Добавьте этот код
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
if (actualPosition.y > 0){
// Dragging down
}else{
// Dragging up
}
}
Похоже, что возникают проблемы с обнаружением направления прокрутки, основанного на переводе распознавателя панорамы scrollView в iOS 7+. Это, кажется, работает довольно легко для моих целей
func scrollViewDidScroll(scrollView: UIScrollView) {
if !scrollDirectionDetermined {
let translation = scrollView.panGestureRecognizer.translationInView(self.view)
if translation.y > 0 {
println("UP")
scrollDirectionDetermined = true
}
else if translation.y < 0 {
println("DOWN")
scrollDirectionDetermined = true
}
}
}
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
scrollDirectionDetermined = false
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
scrollDirectionDetermined = false
}
Взгляните на scrollViewWillEndDragging:withVelocity:targetContentOffset:
.
Вы можете использовать этот метод, чтобы сделать какую-либо проверку и посмотреть, идет ли она туда, где она не должна, а затем в методе вы можете установить новый targetContentOffset
.
В документация:
Этот метод не вызывается, когда значением свойства pagingEnabled для прокрутки является ДА. Ваше приложение может изменить значение параметра targetContentOffset, чтобы настроить, где scrollview заканчивает свою прокручивающую анимацию.
scrollView.panGestureRecognizer translationInView:scrollView
не сообщает ничего полезного в scrollViewWillBeginDragging
в iOS 7.
Это делает:
В @interface
BOOL scrollDirectionDetermined;
и
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (!scrollDirectionDetermined) {
if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
//scrolling rightwards
} else {
//scrolling leftwards
}
scrollDirectionDetermined = YES;
}
}
и
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
scrollDirectionDetermined = NO;
}
Создав ответ @Oscar, вы можете делать такие вещи, как
scrollView.bounces = actualPosition.y < 0
, если вы хотите, чтобы scrollView отскакивал при прокрутке вниз, но не при прокрутке вверху