在启用分页的情况下检测滚动视图中的 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 页(homeView
到 view2
))。该函数只打印一次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 中的上一个/下一个单元格?