检测 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 位置的主要内容,如果未能解决你的问题,请参考以下文章

检测 UIScrollView 位置

何时使用 UITouch 与 UIScroll

UIScroll 及其嵌套元素

在 UIScrollView 仍处于活动状态的情况下检测视图中的连续触摸位置

UIScroll 视图未按预期工作

UIScrollView 检测滚动