swift - 如何使 ScrollView 内的 TableView 的滚动行为自然

标签 swift uitableview uiscrollview uikit uipageviewcontroller

我需要做这个具有奇怪配置的应用程序。

如下图所示,主视图是 UIScrollView。然后里面应该有一个UIPageView,PageView的每个页面都应该有一个UITableView。

figure

到目前为止我已经完成了这一切。但我的问题是我希望滚动表现自然

接下来就是我的意思自然。目前,当我在其中一个 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 来演示结果:

enter image description here

关于swift - 如何使 ScrollView 内的 TableView 的滚动行为自然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57721018/

相关文章:

ios - 键盘显示时 Tableview 滚动内容

objective-c - 如何识别点击了tableview中的哪个单元格

ios - SWIFT:排序 TableView 并将数据传递给第二个 viewController

ios - rx_itemsWithCellFactory 调用语法

swift 错误 : 'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent

iphone - 在uitableview中禁用橡皮筋滚动

iphone - IOS 3.1.3中启用UIScrollView分页问题

ios - NSFileProviderExtension扩展显示下载进度

ios - 为什么我的 UITableViewCell 附件复选标记不会显示?

ios - 行 -1 或 NSUIntegerMax 由 -[UITableViewDelegate tableView :titleForDeleteConfirmationButtonForRowAtIndexPath:] 给出