我需要做这个具有奇怪配置的应用程序。
如下图所示,主视图是 UIScrollView。然后里面应该有一个UIPageView,PageView的每个页面都应该有一个UITableView。
到目前为止我已经完成了这一切。但我的问题是我希望滚动表现自然。
接下来就是我的意思自然。目前,当我在其中一个 UITableView 上滚动时,它会滚动 TableView (而不是 ScrollView )。但我希望它滚动 ScrollView,除非 ScrollView 无法滚动,因为它到达了顶部或底部(在这种情况下,我希望它滚动 tableview)。
例如,假设我的 ScrollView 当前滚动到顶部。然后,我将手指放在表格 View (当前显示的当前页面)上并开始向下滚动。在这种情况下,我希望 ScrollView 滚动(没有表格 View )。如果我继续向下滚动 ScrollView 并且它到达底部,如果我将手指从显示器上移开并将其放回到 tebleview 上并再次向下滚动,我希望我的桌面 View 现在向下滚动,因为 ScrollView 到达了底部并且它不是能够继续滚动。
你们知道如何实现这种滚动吗?
我真的迷失了。任何帮助将不胜感激:(
谢谢!
最佳答案
同时处理 ScrollView 和表格 View 的解决方案围绕着UIScrollViewDelegate
。因此,让您的 View Controller 符合该协议(protocol):
class ViewController: UIViewController, UIScrollViewDelegate {
我将把 ScrollView 和表格 View 表示为导出:
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var tableView: UITableView!
我们还需要跟踪 ScrollView 内容的高度以及屏幕高度。稍后您就会明白原因。
let screenHeight = UIScreen.mainScreen().bounds.height
let scrollViewContentHeight = 1200 as CGFloat
在viewDidLoad:
中需要进行一些配置:
override func viewDidLoad() {
super.viewDidLoad()
scrollView.contentSize = CGSizeMake(scrollViewContentWidth, scrollViewContentHeight)
scrollView.delegate = self
tableView.delegate = self
scrollView.bounces = false
tableView.bounces = false
tableView.scrollEnabled = false
}
为了简单起见,我关闭了弹跳。 关键设置是 ScrollView 和表格 View 的委托(delegate),以及首先关闭表格 View 滚动。
这些是必需的,以便 scrollViewDidScroll:
委托(delegate)方法可以处理到达 ScrollView 的底部和到达表格 View 的顶部。这是该方法:
func scrollViewDidScroll(scrollView: UIScrollView) {
let yOffset = scrollView.contentOffset.y
if scrollView == self.scrollView {
if yOffset >= scrollViewContentHeight - screenHeight {
scrollView.scrollEnabled = false
tableView.scrollEnabled = true
}
}
if scrollView == self.tableView {
if yOffset <= 0 {
self.scrollView.scrollEnabled = true
self.tableView.scrollEnabled = false
}
}
}
委托(delegate)方法正在做的是检测 ScrollView 何时到达底部。当发生这种情况时, TableView 可以滚动。它还会检测表格 View 何时到达重新启用 ScrollView 的顶部。
我创建了一个 GIF 来演示结果:
关于swift - 如何使 ScrollView 内的 TableView 的滚动行为自然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57721018/