在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化

Posted

技术标签:

【中文标题】在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化【英文标题】:Detect when y offset changes in scrollView with paging enabled 【发布时间】:2017-05-19 19:09:23 【问题描述】:

我想找出用户可以看到哪个页面,并在检测到页面更改时执行特定操作。为此,我使用了函数scrollViewDidScroll。由于我没有得到我想要的结果(没有发生任何事情),我在 *** 上寻找答案并找到了以下问题的答案:Detecting UIScrollView page change,更准确地说,我使用了 Michael Waterfall 的答案并转换了 Objective- C 代码到 swift 代码。

您将在下面找到我用来在class HomeController: UIViewController, UIScrollViewDelegate 中创建滚动视图的代码。此外,Michael Waterfall 的函数在函数initiateScrollView() 中被声明和调用。但是,该函数不打印任何内容。你知道我在哪里做错了吗?我看不出我在哪里犯了错误。当我滚动时没有任何反应(例如从第 1 页到第 2 页(homeViewview2))。该函数只打印一次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))

【问题讨论】:

【参考方案1】:

您忘记将 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(...)

【讨论】:

不,它仍然不会打印任何东西。 您应该删除独立行scrollViewDidScroll(scrollView: scrollView)(在contentSize 语句之前),并删除函数func ScrollViewDidScroll(...) ... 并将其放在viewController 类中,而不是放在initiateScrollView() 函数中。不要忘记也设置委托。 但是我需要将pageSize.height 设为全局,不是吗? 是的。但是您可以丢弃pageSize.height 并使用它的正确值self.view.bounds.size.height 你不要调用这个函数,当你滚动滚动视图时它会自动调用,正如它的名字所暗示的那样。【参考方案2】:

这是因为您没有设置滚动视图的委托属性。 在您的initialScrollView 方法中添加scrollView.delegate = self

【讨论】:

以上是关于在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化的主要内容,如果未能解决你的问题,请参考以下文章

在启用分页的情况下使两个 UICollectionView 同步滚动

UICollectionView 在启用分页的情况下不会滚动完整的 320 点

在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?

启用分页的 UISCrollview

具有滚动效果的页面视图控制器与启用分页的 UIScrollView

带有分页的水平滚动视图中的全宽标签