簡體   English   中英

檢測啟用了分頁的scrollView中y偏移量何時發生變化

[英]Detect when y offset changes in scrollView with paging enabled

我想找出對用戶可見的頁面,並且在檢測到頁面更改時也要執行某些操作。 為此,我使用功能scrollViewDidScroll 由於沒有得到想要的結果(什么都沒有發生),我在stackoverflow上尋找了答案,並找到了以下答案的問題: 檢測UIScrollView頁面更改 ,更准確地說,我使用了Michael Waterfall的答案並轉換了Objective -C代碼快速代碼。

在下面,您將在我的class HomeController: UIViewController, UIScrollViewDelegate {找到用於創建scrollView的代碼class HomeController: UIViewController, UIScrollViewDelegate { 此外,Michael Waterfall的函數在函數initiateScrollView()聲明和調用。 但是,該功能不會打印任何內容。 你知道我在做什么錯嗎? 我看不到我在哪里弄錯了。 滾動時什么也沒有發生(例如,從第1頁到第2頁( homeViewview2 ))。 該函數僅before: 0打印before: 0一次,此后什么也沒有發生。

override func viewDidLoad() {

    super.viewDidLoad()
    view.backgroundColor = .white

    initiateScrollView()

}

func initiateScrollView() {

    //create scrollView with paging enabled
    let scrollView = UIScrollView(frame: view.bounds)
    scrollView.isPagingEnabled = true
    view.addSubview(scrollView)

    //get page size
    let pageSize = view.bounds.size

    //individual views
    let homeView = UIView()
    homeView.backgroundColor = .green

    let view2 = UIView()
    view2.backgroundColor = .blue

    let view3 = UIView()
    view3.backgroundColor = .red

    //array with individual views
    let pagesViews = [homeView, view2, view3]

    //amount of views
    let numberOfPages = pagesViews.count
    print(numberOfPages) //prints '3'

    //add subviews (pages)
    for (pageIndex, page) in pagesViews.enumerated(){

        //add individual pages to scrollView
        page.frame = CGRect(origin: CGPoint(x:0 , y: CGFloat(pageIndex) * pageSize.height), size: pageSize)
        scrollView.addSubview(page)

    }

    func scrollViewDidScroll(scrollView: UIScrollView) {

        var previousPage = 0
        let fractionalPage: Float = Float(scrollView.contentOffset.y / pageSize.height)
        let page = lround(Double(fractionalPage))

        print("before:", page) //prints 'before: 0' once

        if previousPage != page {

            // Page has changed, do your thing!
            // ...
            // Finally, update previous page
            print("before:", page)
            previousPage = page
            print("after:", page)

        } //never prints anything

    }

    scrollViewDidScroll(scrollView: scrollView)

    //define size of scrollView
    scrollView.contentSize = CGSize(width: pageSize.width, height: pageSize.height * CGFloat(numberOfPages))
}

您忘記將viewController設置為滾動視圖的委托,如下所示:

func initiateScrollView() {

//create scrollView with paging enabled
let scrollView = UIScrollView(frame: view.bounds)
scrollView.isPagingEnabled = true
scrollView.delegate = self
view.addSubview(scrollView)
(...) } 

而且我建議您使用scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)函數,而不要使用scrollViewDidScroll(...)

這是因為您尚未設置滾動視圖的委托屬性。 在您的scrollView.delegate = self方法中添加scrollView.delegate = self

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM