ios - 在启用分页的情况下检测 scrollView 中的 y 偏移何时发生变化

标签 ios swift uiscrollview

我想找出哪个页面对用户可见,并在检测到页面发生变化时执行特定操作。为此,我使用函数 scrollViewDidScroll .由于我没有得到我想要的结果(什么也没发生),我在 stackoverflow 上寻找答案并找到了以下已回答的问题:Detecting UIScrollView page change ,更准确地说,我使用了 Michael Waterfall 的答案并将 Objective-C 代码转换为 swift 代码。

您将在下面找到我用于在我的 class HomeController: UIViewController, UIScrollViewDelegate { 中创建 ScrollView 的代码。此外,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))
}

最佳答案

您忘记将 viewController 设置为 ScrollView 的委托(delegate),如下所示:

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(...)

关于ios - 在启用分页的情况下检测 scrollView 中的 y 偏移何时发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44077411/

相关文章:

ios - 在 iOS 上使用 midi 演奏打击乐器

swift - Firebase 推送通知在 iOS 13 上不起作用

ios - Swift 3 - 为什么我的导航栏不显示?

ios - UIScrollView 保持不变

ios - 滚动 uiscrollview 时淡化 UITextView

ios - 如何让我的 UIButton 标题有一些填充?

ios - 漫游时CTCarrier mobileNetworkCode会变吗?

ios - 不能使用导入框架,有红色

ios - 如何根据 tableview 的 contentOffset 显示/隐藏自定义 View ?

swift - 如何在 swift 3.0 中设置 scrollview 内容大小