【问题标题】:How to calculate the destination contentOffset of a UIScrollView in motion如何计算运动中 UIScrollView 的目标 contentOffset
【发布时间】:2011-02-07 16:23:53
【问题描述】:

我使用 UIScrollView 作为使用核心动画的组件的基础。当用户滑动视图时,我想根据滚动视图的目标(静止)位置定位元素。为此,我需要在 scrollViewWillBeginDecelerating: 方法或类似方法中计算 UIScrollView 的目标 contentOffset。

我需要这个的原因是我将使用目标 contentOffset 将嵌套在滚动视图的 contentView 中的视图动画到它们的最终位置。我当然可以在 contentOffset 或类似内容上设置一个观察者,但这会导致动画混乱,因为嵌套视图会在减速期间多次更新它们的位置。我希望这种情况只发生一次。

有没有简单的方法来做到这一点?

【问题讨论】:

标签: iphone cocoa-touch uikit


【解决方案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】:

      我相信您指的是pagingEnabledUIScrollView 上自动提供的行为。从UIScrollView 上的iOS Reference Library 开始,当启用分页时,“当用户滚动时,滚动视图会在滚动视图边界的倍数处停止。”我一直使用这种行为,我相信这就是你所描述的。它为您处理所有繁重的工作 - 只需设置一个属性!

      更新:我想我误解了你的问题。您可以随时检查UIScrollViewcontentOffset 属性以确定其在滚动视图中的当前原点。您可以在其中一种委托方法中执行此操作,可能是 scrollViewDidEndDecelerating:

      【讨论】:

      • 是的,你可以得到当前的contentOffset,但是我需要目的地的contentOffset...
      • 在滚动视图停止移动之前如何知道最终的 contentOffset?
      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多