在拖动手势期间在嵌套的UIScrollViews之间切换

时间:2014-12-12 13:26:45

标签: ios objective-c uiscrollview nested scrollview

我在表视图中有一个tableview。我希望父表视图仅在子表视图的垂直内容偏移量为零时移动。

我对此规范的困难在于,响应者应该在拖动手势期间更改这一事实使其更加复杂。实际上,子表视图将向上滚动,直到childTableView.contentOffset.y< = 0,此时父表视图开始滚动,子表视图停止滚动。

我已尝试从两个表视图中复杂地安排滚动视图回调,以便在责任发生变化时进行调整。此时我移动了主动手势的指针。但这需要移开你的手指并重新涂抹你的手指,这是不好的。

我试过子类化子表视图,设置数据源(viewForHitTest :)覆盖'hitTest:withEvent'并有条件地返回父表视图。但是这需要在滚动开始之前做出决定,并且在确定哪个视图应该是响应者之前我需要知道用户正在滚动哪个方向。

我已经尝试禁用delayedContentTouches并使用'shouldBeginTouches',但同样,我无法确定用户将滚动的方向。

我还试图覆盖UIResponder touchesBegan:withEvent touchesMoved:withEvent等但是文档声明这种方法仅在您希望在兄弟子视图之间实现转发手势的细粒度控制时才有意义。

我看过Apple'在iOS 7中探索滚动视图'WWDC 2013,它在2014年WWDC中相当,但无济于事。嵌套的滚动视图讨论,优秀的演示不适用于这种情况,因为它们使用变换调整作为幻觉,它们可以很容易地重置。

有没有人有任何创意?

1 个答案:

答案 0 :(得分:0)

没有代码就很难帮助你。但如果你想要一个想法和一个地方进行测试。 tableView都是scrollView,如果使用scrollViewDidScroll:方法委托。你可以看到谁调用这个方法,是它的位置,是否使用。我认为玩这种方法你可能会找到一些解决方案。

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
 // Who scroll
 if ([scrollView isEqual:self.sonTableView] && scrollView.contentOffset.y != 0)
 {
     self.sonTableView.contentOffset = scrollView.contentOffset;
     // Father nothing (OR what you want.
 }
 else if ([scrollView isEqual:self.sonTableView] && scrollView.contentOffset.y == 0)
 {
    // don't disable at first, because we abort the gesture. (In other delegate you can disable)
   // self.sonTableView.scrollEnabled = NO;
    // We stop the scroll in the son by code: 
    self.sonTableView.contentOffset = CGPointMake(0,0);
    // And here we star moving the father. 
    self.father.contentOffset = CGPointMake(fatherIni.x + (-scrollview.contentOffset.x),fatherIni.y + (-scrollview.contentOffset.y));


 }
 else if ([scrollView isEqual:self.father] && // Other conditon)
 {
    // do what you want
 }
 else if (// other condiction)
 {
    // wake up the son.
 }

 } 

其他选项同时禁用这两个选项,并在清晰视图中使用UIPanGesture,并将内容偏移设置为根据它们的位置和此平移手势。