Прокрутка содержания представления прокрутки
Наиболее распространенный метод инициирования прокрутки представления прокрутки является непосредственным управлением пользователем, касающимся экрана и перетаскивающим с его или ее пальцем. Содержание прокрутки тогда прокручивает в ответ на действие. Этот жест упоминается как жест перетаскивания.
Изменение жеста перетаскивания является жестом щелчка. Жест щелчка является быстрым перемещением пальца пользователя, устанавливающего начальный контакт с экраном, перетаскивающего в направлении желаемой прокрутки, и затем поднимающегося с экрана. Этот жест не только вызывает прокрутку, он передает импульс, на основе скорости действия перетаскивания пользователя, заставляющего прокрутку продолжаться даже после того, как завершается жест. Прокрутка тогда замедляется за установленный период времени. Жест щелчка позволяет пользователям перемещать большие расстояния с единственным действием. В любое время во время замедления, пользователь может коснуться экрана для остановки прокрутки на месте. Все это поведение создается в UIScrollView
и не требует никакой реализации со стороны разработчика.
Но иногда необходимо для приложения прокрутить содержание программно, например, вывести на экран определенную часть документа. В тех случаях, UIScrollView
обеспечивает требуемые методы.
UIScrollView
протокол делегата UIScrollViewDelegate
обеспечивает методы, позволяющие Вашему приложению отслеживать прокрутку, развиваются и отвечают как надлежащий определенным потребностям Вашего приложения.
Прокрутка программно
Прокрутка содержания представления прокрутки не всегда в ответ на перетаскивание пальца пользователя или щелкающий экраном. Существуют времена, когда Ваше приложение должно будет прокрутить к определенному смещению содержания, так, чтобы определенная прямоугольная область была представлена, или вершине представления прокрутки. UIScrollView
обеспечивает методы для выполнения всех этих действий.
Прокрутка к определенному смещению
Прокрутка к определенному верхнему левому расположению ( contentOffset
свойство), может быть выполнен двумя способами. setContentOffset:animated:
метод прокручивает содержание к указанному смещению содержания. Если анимированный параметр YES
, прокрутка анимирует от текущей позиции до указанной позиции на постоянном уровне. Если анимированный параметр NO
, прокрутка непосредственна, и никакая анимация не имеет место. В обоих случаях делегат отправляется a scrollViewDidScroll:
сообщение. Если Вы устанавливаете содержание, смещенное путем установки, если анимация отключена, или contentOffset
свойство непосредственно, делегат получает сингл scrollViewDidScroll:
сообщение. Если анимация включена, то делегат получает серию scrollViewDidScroll:
сообщения как анимация происходят. Когда анимация завершена, делегат получает a scrollViewDidEndScrollingAnimation:
сообщение.
Создание видимого прямоугольника
Также возможно прокрутить прямоугольную область так, чтобы это было видимо. Это особенно полезно, когда приложение должно вывести на экран управление, которое в настоящее время является вне видимой области в видимое представление. scrollRectToVisible:animated:
метод прокручивает указанный прямоугольник так, чтобы это было просто видимо в представлении прокрутки. Если анимированный параметр YES
, прямоугольник прокручивается в представление в постоянном темпе. Как с setContentOffset:animated:
, если анимация отключена, делегат отправляется сингл scrollViewDidScroll:
сообщение. Если анимация включена, делегат отправляется серию scrollViewDidScroll:
сообщения как анимация развиваются. В случае scrollRectToVisible:animated:
отслеживание представления прокрутки и перетаскивание свойств также NO
.
Если для анимации включают scrollRectToVisible:animated:
, делегат получает a scrollViewDidEndScrollingAnimation:
сообщение, обеспечивая уведомление, что представление прокрутки достигло указанного расположения и анимации, завершено.
Прокрутите к вершине
Если строка состояния видима, представление прокрутки может также прокрутить к вершине содержания в ответ на касание в строке состояния. Эта практика распространена в приложениях, обеспечивающих вертикальное представление данных. Например, фото поддержка приложений прокручивает к вершине, и в табличном представлении выбора альбома и при просмотре миниатюр фотографий в альбоме и большинстве UITableView
реализации (подкласс UIScrollView
) также поддержка прокручивает к вершине..
Ваше приложение включает это поведение путем реализации метода делегата свойство представления прокрутки scrollViewShouldScrollToTop:
и возвратитесь YES
. Этот метод делегата позволяет тонкозернистое управление, по которому представление прокрутки прокрутит к вершине, если будут многократные представления прокрутки об экране когда-то путем возврата представления прокрутки для прокрутки.
Когда прокрутка завершена, делегат отправляется a scrollViewDidScrollToTop:
сообщение, указывая представление прокрутки.
Делегат обменивается сообщениями отправленный во время прокрутки
Поскольку прокрутка происходит, состояние дорожек представления прокрутки с помощью tracking
, dragging
, decelerating
, и zooming
свойства. Кроме того, contentOffset
свойство определяет точку в содержании, которое видимо наверху оставленное границ представления прокрутки.. Следующая таблица описывает каждую государственную собственность:
Государственная собственность | Описание |
---|---|
|
|
|
|
|
|
|
|
| A |
Не необходимо опросить эти свойства для определения происходящего действия, потому что представление прокрутки отправляет подробную последовательность сообщений делегату, указывая прогресс действия прокрутки. Эти методы позволяют Вашему приложению отвечать по мере необходимости. Методы делегата могут запросить ту государственную собственность для определения, почему сообщение было получено или где представление прокрутки в настоящее время.
Простой подход: отслеживание запуска и завершения действия прокрутки
Если Вашему приложению интересно только в начале и окончании процесса прокрутки, можно реализовать только маленькое подмножество возможных методов делегата.
Реализуйте scrollViewWillBeginDragging:
метод для получения уведомления, которое начнет перетаскивание.
Для определения, когда прокрутка завершена, необходимо реализовать два метода делегата: scrollViewDidEndDragging:willDecelerate:
и scrollViewDidEndDecelerating:
. Когда делегат получает, прокрутка завершается также scrollViewDidEndDragging:willDecelerate:
сообщение с NO
как замедлять параметр, или когда Ваш делегат получает scrollViewDidEndDecelerating:
метод. В любом случае прокрутка завершена.
Полная последовательность сообщений делегата
Когда пользователь касается экрана, последовательность отслеживания начинается. tracking
свойство установлено в YES
сразу, и остается YES
пока палец пользователя находится в контакте с экраном, независимо от того, шевелят ли они пальцем.
Если палец пользователя остается стационарным и довольное, представление реагирует на сенсорные события, это должно обработать касание, и последовательность завершена.
Однако, если пользователь шевелит пальцем, последовательность продолжается.
Когда пользователь начинает шевелить его или ее пальцем для инициирования прокрутки первых попыток представления прокрутки (принимающий значения по умолчанию представления прокрутки) отменить любого в сенсорной обработке прогресса, если это пытается сделать так.
Представление прокрутки dragging
свойство установлено в YES
, и его делегат отправляется scrollViewWillBeginDragging:
сообщение.
Поскольку пользователь перетаскивает его или ее палец, scrollViewDidScroll:
сообщение отправляется делегату. Это сообщение отправляется постоянно, поскольку продолжается прокрутка. Ваша реализация этого метода может запросить представление прокрутки contentOffset
свойство для определения расположения верхнего левого угла прокрутки просматривает границы. contentOffset
свойство всегда является текущим расположением верхнего левого угла границ прокрутки, происходит ли прокрутка или нет.
Если пользователь выполняет жест щелчка, tracking
свойство установлено в NO
, потому что для выполнения жеста щелчка, контакта повреждений пальца пользователя с экраном после того, как начальный жест начинает прокрутку. В это время делегат получает a scrollViewDidEndDragging:willDecelerate:
сообщение. Параметр замедления будет YES
поскольку прокрутка замедляется. Скоростью замедления управляют decelerationRate
свойство. По умолчанию это свойство установлено в UIScrollViewDecelerationRateNormal
, который позволяет прокручивать для продолжения в течение долгого времени. Можно установить уровень в UIScrollViewDecelerationFast
заставить замедление занимать значительно меньше времени, прокрученное расстояние после жеста щелчка, чтобы быть намного короче. Поскольку представление замедляется, decelerating
свойство представления прокрутки YES
.
Если пользователь перетаскивает, прекращает перетаскивать и затем шевелит их пальцем с экрана, делегат получает scrollViewDidEndDragging:willDecelerate:
сообщение, однако параметр замедления NO
. Это вызвано тем, что никакой импульс не был передан на представлении прокрутки. Поскольку палец пользователя больше не находится в контакте с экраном tracking
значение свойства NO
.
Если замедлять параметр scrollViewDidEndDragging:willDecelerate:
сообщение NO
, тогда делегат представления прокрутки не получит больше сообщений делегата для этого действия перетаскивания. Свойство замедления представления прокрутки также теперь возвращает значение NO
.
Существует одно другое условие, вызывающее scrollViewDidEndDragging:willDecelerate:
сообщение, которое будет отправлено делегату, даже если пользователь пошевелил его или ее пальцем, когда является стационарным. Когда пользователь перетаскивает содержание мимо края области прокрутки, если представление прокрутки сконфигурировано для обеспечения визуального индикатора возврата scrollViewDidEndDragging:willDecelerate:
сообщение отправляется делегату с YES
как замедлять параметр. Возврат включен когда bounces
свойство YES
(состояние по умолчанию). alwaysBounceVertical
и alwaysBounceHorizontal
свойства не влияют на поведение представления прокрутки когда bounces
NO
. Если bounces
YES
, они позволяют возвращаться когда contentSize
значение свойства меньше, чем границы представления прокрутки.
Независимо от условия, заставившего представление прокрутки получать scrollViewDidEndDragging:willDecelerate:
сообщение, если замедлять параметр YES
, представление прокрутки отправляется scrollViewWillBeginDecelerating:
сообщение. Во время замедления делегат продолжает получать scrollViewDidScroll:
сообщение, несмотря на то, что tracking
и dragging
значения - теперь оба NO
. decelerating
свойство продолжает быть YES
.
Наконец, когда замедление представления прокрутки завершается, делегат отправляется a scrollViewDidEndDecelerating:
сообщение, decelerating
свойство имеет значение NO
, и последовательность прокрутки завершена.