如何与作为滚动视图子视图的水平滚动视图交互?

Posted

技术标签:

【中文标题】如何与作为滚动视图子视图的水平滚动视图交互?【英文标题】:How to interact with a horizontal scrollview that is a subview of a scroll view? 【发布时间】:2013-03-16 03:15:38 【问题描述】:

我有一个水平滚动视图,它是垂直滚动视图的子视图。看起来垂直滚动视图正在拦截所有用户交互。我希望能够水平滚动水平滚动视图。我该怎么做?

这是我的代码的简短 sn-p:

  UIScrollView *scrollView2 = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,     self.view.width, 100)];

  scrollView2.contentSize = CGSizeMake(self.view.bounds.size.width + 400, 100);

  _scrollView.contentSize = CGSizeMake(self.view.width, 400);

  _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.height - 108)];

[self.view addSubview:_scrollView];

[_scrollView addSubview:scrollView2];

【问题讨论】:

UIScrollView within UIScrollView的可能重复 在给定的欺骗中查看@BenGottlieb 的answer。 似乎无法正常工作。我在正文中包含了简单的 sn-p 代码。 【参考方案1】:

您可以子类化父滚动视图并覆盖 touchesShouldCancelInContentView: 以在视图为子滚动视图时返回 NO。即;

MyScrollView.h

@interface MyScrollView: UIScrollView
@end

在 MyScrollView.m 中

@implementation MyScrollView


-(BOOL)touchesShouldCancelInContentView:(UIView *)touchedView
      if(touchedView == _scrollView2) //Get the reference of that child scroll view here
         return NO;
      else
         [super touchesShouldCancelInContentView:touchedView];
      

那么您发布的代码应如下所示:

UIScrollView *scrollView2 = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,     self.view.width, 100)];

  scrollView2.contentSize = CGSizeMake(self.view.bounds.size.width + 400, 100);



  _myScrollView = [[MyScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.height - 108)];
  _myScrollView.contentSize = CGSizeMake(self.view.width, 400);


[_myScrollView addSubview:scrollView2];
[self.view addSubview:_myScrollView];

【讨论】:

例如:创建父滚动视图的子类,并在该类中添加scrollview2作为子视图。然后执行以下操作: -(BOOL)touchesShouldCancelInContentView:(UIView *)touchedView if(touchedView == _scrollView2) return NO; else [super touchesShouldCancelInContentView:touchedView]; 不确定这是否正确。 不是父视图的子类。使父视图成为 UIScrollVIew 的子类。然后照你说的做。 @user2172447:另一件事。您似乎在初始化之前设置了_scrollViewcontentSize。那是行不通的。我已经更新了我的答案。让我知道它是否有效。【参考方案2】:

无法评论。因此在这里回答。

我之前遇到过这个问题。我不记得确切的解决方案。但我认为问题在于您试图在第二个视图控制器之后添加第二个视图控制器。我认为你应该反过来尝试。

[_scrollView addSubview:scrollView2];
[self.view addSubview:_scrollView];

【讨论】:

以上是关于如何与作为滚动视图子视图的水平滚动视图交互?的主要内容,如果未能解决你的问题,请参考以下文章

缩放时,UIScrollview 子视图无法识别手势

UIScrollview 子视图在缩放后无法识别平移手势

如何将 UIWebView 垂直滚动事件传输到父视图?

滚动列表视图垂直和水平相同的图像

如何将 UITableviewcell 子视图添加为 uiscrollview

滚动其他滚动视图时滚动视图重置