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

我想找出用户可以看到哪个页面,并在检测到页面更改时执行特定操作。为此,我使用了函数scrollViewDidScroll。由于我没有得到我想要的结果(没有发生任何事情),我在 stackoverflow 上寻找答案并找到了以下问题的答案: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))
}

【问题讨论】:

    标签: ios swift uiscrollview


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2013-07-24
      相关资源
      最近更新 更多