在UIScrollView

时间:2015-06-23 18:52:07

标签: ios uitableview uiscrollview uigesturerecognizer

第二次更新感谢@ Segev的评论和对另一个主题的引用,我能够改进我的demo以使其基本上做我想要的。然而,它仍然没有Instagram的实现那么顺利,我想知道是否有人知道如何改进它以使其更顺畅?此外,我注意到有时(在我的演示中),当我向左/向右快速扫动并且我想切换到向上/向下滑动时,它仍将继续向左/向右滑动,直到我停止滑动并让它先停下来。

更新:通过继承UIScrollView并实现UIGestureRecognizerDelegate中的shouldRecognizeSimultaneouslyWithGestureRecognizer和shouldBeRequiredToFailByGestureRecognizer方法,我可以在停止向上/向下滚动后左/右滑动表格视图。我的想法是在ifRecognizeSimultaneouslyWithGestureRecognizer中返回true,如果用户向上/向下滚动tableView,然后在shouldBeRequiredToFailByGestureRecognizer中使表视图的向上/向下手势失败。

但是我仍然无法弄清楚如何让用户在停止初始向上/向下滚动(并且用户的手指仍然在设备上)之后向上/向下或向左/向右滚动。

我在这里创建了一个示例项目https://github.com/paulsfds/TableViewsInScrollView。您可以通过向下滑动表格视图一次来测试此操作,然后抬起手指,当它仍在滚动时,将手指放回以停止滚动。当您的手指仍在桌面视图上时,请尝试向左/向右滑动,它应该可以正常工作。但是,如果您尝试多次向下滑动表格视图,则会执行此实现,但有时会卡住,因为它会认为您正在尝试向左/向右滑动。有什么想法吗?

原文:我有一些UITcrollView在启用了分页的UIScrollView中,并且设置为让我向左和向右翻页,以便一次只能看到一个UITableView。这是一张图表(取自Conflictive scroll on UITableView within UIScrollView

                                 +--visible area--+  ---+
+---------`UIScrollView`---------+---------------+|  --+|
| +-------------+ +-------------+|+-------------+||  -+||
| |      0      | |      1      |||      2      |||   |||
| |`UITableView`| |`UITableView`|||`UITableView`|||  equal height
| |             | |             |||             |||   |||
| +-------------+ +-------------+|+-------------+||  -+||
+--------------------------------+---------------+|  --+| 
                                 +----------------+  ---+

我想要实现的是,如果用户向下滚动表格视图,然后将其手指抬起(并且向下滚动动画仍在发生),则用户可以选择向左和向右滑动以转到下一个表视图。现在,如果用户向下滚动表格视图,然后抬起他们的手指,同时仍然发生向下滚动动画,然后将他们的手指放回去向左和向右滑动,它将不允许用户向左滚动并且是的,我被困在查看已经可见的表视图,除非我等待表视图滚动完全停止然后向左和向右滑动。

TL; DR 基本上我无法向上/向下滚动表格并同时在滚动视图中向左/向右滑动,但我希望能够做到这一点。这方面的一个例子是在Activity选项卡上的iOS Instagram应用程序中。您可以向下滚动,然后在表格视图仍在滚动时向右滑动。

4 个答案:

答案 0 :(得分:5)

enter image description here

这是一个有效的示例项目: https://github.com/rishi420/SwipeWhileScroll

您可以在此处详细了解此主题:

Cross Directional UIScrollViews - Can I Modify the Scrolling Behaviour?

答案 1 :(得分:4)

不幸的是,Apple不支持在UIScrollViews中嵌入UITableViews:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/index.html

  

重要

     

您不应在UIScrollView中嵌入UIWebView或UITableView对象   对象。如果这样做,可能会因触摸而导致意外行为   这两个对象的事件可以混淆和错误处理。

然而,尽管如此,它仍然可能实现您正在寻找的东西。您是否尝试将delayContentTouches设置为true,以便scrollview将其失败的滚动手势(即水平滚动)发送给其子项(即您的tableview)?

self.yourScrollView.panGestureRecognizer.delaysTouchesBegan = true

答案 2 :(得分:1)

虽然这个问题有一个公认的答案,但我想为可能遇到类似问题的其他人提供我自己的解决方案:

使用UICollectionView来分页UITableViews而不是UIScrollView

使用UIStoryboards的基本步骤:

  • 在故事板中为UIViewController添加UICollectionView。
  • 更新UICollectionView的属性,以便您使用分页而不是滚动,并设置布局属性,以便单元格占用UICollecionView的完整大小。
  • 将UITableView添加到UICollectionViewCell。
  • 将UICollectionView的IBOulet添加到ViewController.h并连接插座。
  • 创建一个UICollectionViewCell子类,并将IBOutlet添加到UITableView到单元格.h
  • 在Storyboard中,将UICollectionViewCell的Class类型设置为刚创建的自定义单元格。
  • 为您的UICollectionView和UITableView连接IBOutlets。
  • 最后,您需要为两者设置委托和数据源,并实现这些方法。因为我尝试了这个作为一个简单的例子,我使我的ViewController成为UICollectionView和UITableView的委托和数据源。但是,您的实施可能与此不同。

只要您正确配置您的UICollectionView数据源,它就应该正常页面。

答案 3 :(得分:1)

我刚刚做了类似功能的事情。

对我来说有用的是为UIPanGestureRecognizer做一个扩展(我正在使用swift 2;如果你想我可以重写objC的解决方案)那么我就可以知道用户何时从设备中取出。然后你可以向左/向右滑动我想。

以下是代码,我在下面解释:

扩展名UIPanGestureRecognizer {

public override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent) {
    state = .Ended
    NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "panningEnded", object: nil))
}

}

这是我能够达到特定手势的touchesEnded的唯一方法。您需要做的就是为您发布的通知添加观察者,然后让用户滑动。如果这有用,请告诉我。

亲切的问候