第二次更新感谢@ 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应用程序中。您可以向下滚动,然后在表格视图仍在滚动时向右滑动。
答案 0 :(得分:5)
这是一个有效的示例项目: 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的基本步骤:
只要您正确配置您的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的唯一方法。您需要做的就是为您发布的通知添加观察者,然后让用户滑动。如果这有用,请告诉我。
亲切的问候