Проверка UIScrollView iPhone

Я знаю, как получить contentOffset для движения для UIScrollView, может кто-нибудь объяснить мне, как я могу получить фактическое число, которое представляет текущую скорость UIScrollView во время отслеживания или замедления?

Имейте эти свойства в своем UIScrollViewDelegate

CGPoint lastOffset; NSTimeInterval lastOffsetCapture; BOOL isScrollingFast; 

Затем введите этот код для вашего scrollViewDidScroll:

 - (void) scrollViewDidScroll:(UIScrollView *)scrollView { CGPoint currentOffset = scrollView.contentOffset; NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; NSTimeInterval timeDiff = currentTime - lastOffsetCapture; if(timeDiff > 0.1) { CGFloat distance = currentOffset.y - lastOffset.y; //The multiply by 10, / 1000 isn't really necessary....... CGFloat scrollSpeedNotAbs = (distance * 10) / 1000; //in pixels per millisecond CGFloat scrollSpeed = fabsf(scrollSpeedNotAbs); if (scrollSpeed > 0.5) { isScrollingFast = YES; NSLog(@"Fast"); } else { isScrollingFast = NO; NSLog(@"Slow"); } lastOffset = currentOffset; lastOffsetCapture = currentTime; } } 

И из этого я получаю пиксели за миллисекунду, что если больше 0,5, я регистрировался так быстро, и все, что ниже, регистрируется как медленное.

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

Есть более простой способ: проверить распознаватель жеста UISCrollview. С его помощью вы можете получить скорость так:

 CGPoint scrollVelocity = [[_scrollView panGestureRecognizer] velocityInView:self]; 

Для простого вычисления скорости (все остальные ответы сложнее):

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat scrollSpeed = scrollView.contentOffset.y - previousScrollViewYOffset; previousTableViewYOffset = scrollView.contentOffset.y; } 

Converted @bandejapaisa ответ на Swift 2.2:

Свойства, используемые UIScrollViewDelegate:

 var lastOffset:CGPoint? = CGPointMake(0, 0) var lastOffsetCapture:NSTimeInterval? = 0 var isScrollingFast: Bool = false 

И функция scrollViewDidScroll:

 func scrollViewDidScroll(scrollView: UIScrollView) { let currentOffset = scrollView.contentOffset let currentTime = NSDate().timeIntervalSinceReferenceDate let timeDiff = currentTime - lastOffsetCapture! let captureInterval = 0.1 if(timeDiff > captureInterval) { let distance = currentOffset.y - lastOffset!.y // calc distance let scrollSpeedNotAbs = (distance * 10) / 1000 // pixels per ms*10 let scrollSpeed = fabsf(Float(scrollSpeedNotAbs)) // absolute value if (scrollSpeed > 0.5) { isScrollingFast = true print("Fast") } else { isScrollingFast = false print("Slow") } lastOffset = currentOffset lastOffsetCapture = currentTime } } 

Может быть, это было бы полезно

 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 

Вы можете увидеть пример кода образца страницы о том, как получить contentOffset для scrollview.

contentOffset для перемещения можно получить из метода UIScrollViewDelegate , названного - (void)scrollViewDidScroll:(UIScrollView *)scrollView , scrollView.contentOffset . Текущую скорость можно рассчитать по delta_offset и delta_time.

  • Delta_offset = current_offset – pre_offset;
  • Delta_time = current_time – pre_time;

2017 …

Это очень легко сделать с помощью современных Swift / iOS:

 var previousScrollMoment: Date = Date() var previousScrollX: CGFloat = 0 func scrollViewDidScroll(_ scrollView: UIScrollView) { let d = Date() let x = scrollView.contentOffset.x let elapsed = Date().timeIntervalSince(previousScrollMoment) let distance = (x - previousScrollX) let velocity = (elapsed == 0) ? 0 : fabs(distance / CGFloat(elapsed)) previousScrollMoment = d previousScrollX = x print("vel \(velocity)") 

Конечно, вам нужна скорость в секундах в секунду, что и есть.

Люди перетаскивают, скажем, 200 – 400 pps (на устройствах 2017 года).

1000 – 3000 – быстрый бросок.

По мере того, как он замедляется до остановки, общий уровень составляет 20-30.

Очень часто вы увидите такой код.

  if velocity > 300 { // the display is >skimming< some_global_doNotMakeDatabaseCalls = true some_global_doNotRenderDiagrams = true } else { // we are not skimming, ok to do calculations some_global_doNotMakeDatabaseCalls = false some_global_doNotRenderDiagrams = false } 

Это основа для «skimming engineering» на мобильных телефонах. (Это большая и трудная тема).

Обратите внимание, что это не полное решение для скиминга; вы также должны заботиться о необычных случаях, таких как «он остановился», «экран закрыт» и т. д. и т. д.

Вот еще один умный способ сделать это в SWIFT: –

 func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { if velocity.y > 1.0 || velocity.y < -1.0 && self.sendMessageView.isFirstResponder() { // Somthing you want to do when scrollin fast. // Generally fast Vertical scrolling. } } 

Поэтому, если вы прокручиваете вертикально, вы должны использовать speed.y, а также, если вы прокручиваете по горизонтали, вы должны использовать speed.x. Обычно, если значение больше 1 и меньше -1, оно представляет собой быструю прокрутку. Таким образом, вы можете изменить скорость, как хотите. + означает, что прокрутка вверх и -значение означает прокрутку вниз.

  • Интерфейс UIScrollViewBegan
  • Как прокрутить UITableView в определенную позицию
  • как удалить subviews из scrollview?
  • Получение видимого прямоугольника содержимого UIScrollView
  • Центральное содержимое UIScrollView при меньшем
  • UIScrollview с UIButtons - как воссоздать трамплин?
  • Прокрутка Не работает IOS 7
  • Отключить прокрутку UIScrollView, когда UITextField становится первым ответчиком
  • UIScrollView не прокручивается после обновления до iOS7 / xcode 5
  • как использовать UIScrollView в Interface Builder?
  • Как украсть штрихи от UIScrollView?
  • Interesting Posts

    Является ли SHA-1 безопасным для хранения паролей?

    Создайте переменную в файле .CSS для использования в этом файле .CSS

    Symfony2 переписать правила .htaccess app.php

    Беспроводная связь от 54 Мбит / с до 1 Мбит / с

    Как вы должны диагностировать ошибку? SEHException – Внешний компонент выбрал исключение

    Scala underscore – ОШИБКА: отсутствует тип параметра для расширенной функции

    Как сериализировать Joda DateTime с обработчиком Jackson JSON?

    Как настроить SSL-сертификат для сервера express.js?

    Как растянуть WPF вкладку Элементы заголовка к размеру родительского контроля

    Интерпретация переменных String Java

    Зачем вызывать super () в конструкторе?

    Какова ценность неопределенной константы, используемой в #if?

    Почему для 64-битной Windows требуется отдельная папка «Program Files (x86)»?

    Выполняет ли литье в int после std :: floor гарантированный правильный результат?

    Как создать временный файл с помощью Cocoa?

    Давайте будем гением компьютера.