Освоение Swift: как получить текущую страницу в Paged UIScrollView

Метод 1: использование смещения контента

Один из способов получить текущую страницу в постраничном UIScrollView — использовать смещение ее содержимого. Смещение содержимого представляет текущую позицию представления прокрутки, и мы можем использовать его для расчета индекса страницы.

func getCurrentPage(scrollView: UIScrollView) -> Int {
    let pageWidth = scrollView.frame.width
    let currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
    return currentPage
}

В этом методе мы делим смещение содержимого на ширину каждой страницы и округляем его до ближайшего целого числа, чтобы получить индекс текущей страницы.

Метод 2: делегат представления отслеживаемой прокрутки

Другой подход — использовать UIScrollViewDelegate и отслеживать изменения представления прокрутки в режиме реального времени.

class ViewController: UIViewController, UIScrollViewDelegate {
    var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView.delegate = self
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let currentPage = Int(scrollView.contentOffset.x / scrollView.frame.width)
        print("Current Page: \(currentPage)")
    }
}

Реализуя метод scrollViewDidEndDeceleratingиз UIScrollViewDelegate, мы можем определить, когда заканчивается анимация прокрутки, и получить индекс текущей страницы на основе смещения содержимого.

Метод 3: интеграция UIPageControl

Если вы используете UIPageControl для отображения точек нумерации, вы можете синхронизировать его с UIScrollView, чтобы получить текущую страницу.

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let currentPage = Int(scrollView.contentOffset.x / scrollView.frame.width)
    pageControl.currentPage = currentPage
}

Если установить свойство currentPageдля UIPageControl, оно будет автоматически обновляться, отражая текущую страницу при прокрутке пользователем.

Метод 4: использование свойстваvisibleRect

Немного другой подход предполагает использование свойства visibleRectграниц UIScrollView для определения текущей страницы.

func getCurrentPage(scrollView: UIScrollView) -> Int {
    let visibleRect = CGRect(origin: scrollView.contentOffset, size: scrollView.bounds.size)
    let currentPage = Int(visibleRect.midX / scrollView.frame.width)
    return currentPage
}

Вычислив значение MidX видимогоRect и разделив его на ширину каждой страницы, мы можем получить индекс текущей страницы.

Метод 5: интеграция CollectionView

Если вы используете UICollectionView с включенным разбиением по страницам вместо UIScrollView, вы можете извлечь текущую страницу, используя видимые ячейки.

func getCurrentPage(collectionView: UICollectionView) -> Int {
    let visibleCells = collectionView.visibleCells
    guard let currentCell = visibleCells.first else { return 0 }
    let currentPage = collectionView.indexPath(for: currentCell)?.item ?? 0
    return currentPage
}

Получив первую видимую ячейку и получив соответствующий индексный путь, мы можем определить текущую страницу.

Подведение итогов

В этой статье мы рассмотрели несколько методов получения текущей страницы в постраничном UIScrollView. Предпочитаете ли вы использовать смещение контента, отслеживание делегатов, интеграцию UIPageControl, свойствоvisibleRect или интеграцию UICollectionView, теперь у вас есть несколько вариантов на выбор.

Не забудьте учесть конкретные требования вашего приложения и выбрать метод, который лучше всего соответствует вашим потребностям. Приятного кодирования!