视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?

Posted

技术标签:

【中文标题】视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?【英文标题】:Parallax UIScrollView – handling two views in one scrollViewDidScroll method? 【发布时间】:2014-02-13 13:52:20 【问题描述】:

我正在使用两个UIScrollView 实例(cardScrollViewtileScrollView)创建一个与ios7 应用切换器非常相似的基本视差效果。我以不同的速度滚动一个并排,如下所示:

if ([scrollView isEqual:self.tileScrollView]) 
    [self.cardScrollView setContentOffset:CGPointMake((self.tileScrollView.contentOffset.x + 110) * TILE_CARD_DELTA,
                                                      self.cardScrollView.contentOffset.y)];

滚动tileScrollView 时可以正常工作。但是,我希望反向工作,这意味着我可以滚动 cardScrollView 并让 tileScrollView 相应地移动。我遇到的问题是,调用setContentOffset 实际上会导致cardScrollView 调用scrollViewDidScroll 本身,这意味着他们不断地试图同时设置彼此,并且各种地狱都破裂了。

基本上,这里的问题是两个scrollView 实例都依赖同一个scrollViewDidScroll,所以我无法区分其中的两个。

我该如何解决这个问题?

【问题讨论】:

如果你想做类似的事情,你将不得不设置手动平移和滚动。让一个视图控制另一个可以控制第一个视图的视图基本上是一个循环命令。一个将设置另一个将设置第一个将设置第二个等...如果您让超级视图获取触摸事件并使滚动视图不是 userInteractionable 您可以实现您正在寻找的东西。 我不能分配一个不同的代表吗? 两个委托方法仍然会被调用并尝试调整另一个滚动视图。不管你怎么做,它都是循环的。您需要一个包含两个滚动视图并且可以手动控制其运动的视图。 为什么?他们只打电话给我给他们的代表。如果我给它一个其他班级的代表,然后将更改报告回来,应该没问题,不是吗? 你手指滚动一个。它的委托方法被调用。它以编程方式滚动另一个。另一个的委托方法被调用。它以编程方式滚动第一个。你对此无能为力。您可以创建一个控制两者的超级滚动视图,但一个控制另一个控制第一个的不会发生,抱歉。 【参考方案1】:

您将在此方法中获得参考并按要求工作:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

 
   if (scrollView == self.tileScrollView) 
      // do something
   
   else 
      // do something
   
  

【讨论】:

不,这行不通。该方法首先由一个调用,然后由另一个调用,因此这两种条件情况每次都会被命中。 @lukech..你告诉问题是:基本上,这里的问题是两个scrollView实例都依赖于同一个scrollViewDidScroll,所以我无法区分它们两者。 ...你能再说一遍你的要求吗 重读这个问题,伙计 :) 他们都有同一个代表,所以这个scrollViewDidScroll 被两者调用,这意味着如果一个滚动另一个,它是一个循环引用。 我读到@lukech ...你能显示scrollviewdidscroll的代码以及你想要的吗

以上是关于视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 的滚动上更改 UIImageView 中心点

图像缩放时在 UIScrollView 中停止滚动图像

将程序化 uiscrollview 更改为 IB

UIScrollView 的同时滚动

如何配置 UIScrollView 使可见区域永远不会超出背景图像?

ios的折叠工具栏布局