如何计算运动中 UIScrollView 的目标 contentOffset
Posted
技术标签:
【中文标题】如何计算运动中 UIScrollView 的目标 contentOffset【英文标题】:How to calculate the destination contentOffset of a UIScrollView in motion 【发布时间】:2011-02-07 16:23:53 【问题描述】:我使用 UIScrollView 作为使用核心动画的组件的基础。当用户滑动视图时,我想根据滚动视图的目标(静止)位置定位元素。为此,我需要在 scrollViewWillBeginDecelerating: 方法或类似方法中计算 UIScrollView 的目标 contentOffset。
我需要这个的原因是我将使用目标 contentOffset 将嵌套在滚动视图的 contentView 中的视图动画到它们的最终位置。我当然可以在 contentOffset 或类似内容上设置一个观察者,但这会导致动画混乱,因为嵌套视图会在减速期间多次更新它们的位置。我希望这种情况只发生一次。
有没有简单的方法来做到这一点?
【问题讨论】:
看来其他人也有这个需求:***.com/questions/1651560/… 【参考方案1】:有一个委托方法:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_ios5(5_0);
根据文档:
如果用户拖动,则在手指向上调用。速度以点/秒为单位。可以更改 targetContentOffset 以调整滚动视图停止的位置。 pagingEnabled 为 YES 时不调用
【讨论】:
【参考方案2】:不确定你是否还需要这个。但这就是你如何获得 UIScrollView 的委托。
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
NSLog(@"X offset: %f", targetContentOffset->x);
NSLog(@"Y offset: %f", targetContentOffset->y);
【讨论】:
【参考方案3】:您是否需要提前知道滚动视图将在哪里停止的具体原因?您可以在滚动视图委托的实现中将视图放置在 layoutSubviews
(如果您继承 UIScrollView)或 scrollViewDidScroll:
中。
【讨论】:
嗨,是的。我将使用该位置将嵌套在滚动视图的 contentView 中的视图设置为最终位置。我当然可以在 contentOffset 或类似内容上设置观察者,但这会导致动画混乱,因为嵌套视图会在减速期间多次更新它们的位置。【参考方案4】:我相信您指的是pagingEnabled
在UIScrollView
上自动提供的行为。从UIScrollView
上的iOS Reference Library 开始,当启用分页时,“当用户滚动时,滚动视图会在滚动视图边界的倍数处停止。”我一直使用这种行为,我相信这就是你所描述的。它为您处理所有繁重的工作 - 只需设置一个属性!
更新:我想我误解了你的问题。您可以随时检查UIScrollView
的contentOffset
属性以确定其在滚动视图中的当前原点。您可以在其中一种委托方法中执行此操作,可能是 scrollViewDidEndDecelerating:
。
【讨论】:
是的,你可以得到当前的contentOffset,但是我需要目的地的contentOffset... 在滚动视图停止移动之前如何知道最终的 contentOffset?以上是关于如何计算运动中 UIScrollView 的目标 contentOffset的主要内容,如果未能解决你的问题,请参考以下文章
国科大人工智能学院《计算机视觉》课 —运动视觉—视觉跟踪(目标跟踪视觉定位)
国科大人工智能学院《计算机视觉》课 —运动视觉—视觉跟踪(目标跟踪视觉定位)
目标跟踪基于Kalman滤波跟踪视频运动目标matlab代码