检测 UIScrollView 位置
Posted
技术标签:
【中文标题】检测 UIScrollView 位置【英文标题】:Detecting UIScrollView Position 【发布时间】:2012-12-23 16:07:23 【问题描述】:我正在尝试在我的 ios 应用程序中使用 UIScrollView 作为导航设备。基本上,我希望应用程序根据启用分页的 UIScrollView 的位置加载特定内容。它有点像导航轮。
目前,我有一个两页 (2*320) 的滚动视图,我正在使用 scrollViewDidEndDragging
委托方法和 contentoffset.x
加载适当的内容。我尝试这样确定滚动视图的位置:
if (scrollView.contentOffset.x < 320)
// Load content 1
else if (scrollView.contentOffset.x >= 320)
// Load content 2
我的问题是我要么不了解如何使用 contentoffset,要么不适合处理我的问题。无论哪种方式,我都被困住了。有人可以告诉我哪里出错和/或告诉我一个更有效的方法来确定滚动视图的位置吗?
我很傻,我忘了说问题是什么......基本上,我无法跟踪滚动视图的位置。当我移动到第二页时,它只会在我超过 620 限制(向右反弹)时记录更改。但是当我回到起始位置(第 1 页)时,它确实记录了更改。换句话说,我的跟踪不准确。
代表和其他一切都工作正常,我记录他们!
【问题讨论】:
【参考方案1】:很难说,因为你从来没有具体提到过问题是什么,但我会猜测一下。
如果根本没有调用委托方法,您需要记住设置滚动视图委托:
[myScrollView setDelegate:self];
否则,使用scrollViewDidEndDragging
检测滚动视图偏移量的问题在于,它将在您停止拖动的点检查偏移量,该点可能位于目标页面 rect 或起始页面 rect 内。作为替代方案,我建议您使用 scrollViewDidEndDecelerating
检查内容偏移量,因为一旦滚动视图在其目标页面停止,它将被调用。
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
if (scrollView.contentOffset.x < 320)
NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));
else if (scrollView.contentOffset.x >= 320)
NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));
【讨论】:
【参考方案2】:我认为这可以帮助你:)。使用scrollViewDidScroll
,您总能获得滚动视图的确切位置:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if (scrollView.contentOffset.x < 320)
// Load content 1
else if (scrollView.contentOffset.x >= 320)
// Load content 2
NSLog(@"Position: %g", scrollView.contentOffset.x);
不要忘记 .h 文件中的委托 UIScrollViewDelegate
。
【讨论】:
不幸的是并没有解决我的问题。我添加了一些额外的信息来澄清问题所在。【参考方案3】:这里有一个将当前位置(页面)作为整数值的解决方案: 使用 scrollViewDidEndDecelerating: 方法:
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
NSLog(@"%i", (int)(_scrollView.contentOffset.x / _scrollView.frame.size.width));
【讨论】:
【参考方案4】:如果出于任何原因,您希望在视图结束减速之前收到通知;例如,执行动画。你也可以这样用:
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
// Where the scroll will end (vertically)
let offSetY = targetContentOffset.pointee.y
// I've got a scroll view with paging enabled so I use this to check which "page" is selected.
if offSetY == firstPageView.frame.origin.y
// Do something…
else if offSetY == secondPageView.frame.origin.y
// Do something…
【讨论】:
【参考方案5】:使用 UIScrollViewDelegate,
func scrollViewWillBeginDragging(scrollView: UIScrollView)
print("dragging begins")
print("Position: \(scrollView.contentOffset.x) , \(scrollView.contentOffset.y) ")
【讨论】:
以上是关于检测 UIScrollView 位置的主要内容,如果未能解决你的问题,请参考以下文章