【问题标题】:Can UITableView scroll with UICollectionView inside it?UITableView 可以在里面滚动 UICollectionView 吗?
【发布时间】:2016-08-05 21:09:10
【问题描述】:

我有下面的结构...

我将两个集合视图包装到 tableview 中

一个在tableview header(Collection1),另一个在tableview第一行(Collection2)。

所有功能都很好(两个集合视图)。

只是……

当我在 Collection2 中向上滚动时,Collection1 不会一起向上滚动,因为我只滚动 collectionViews 而不是 tableview。

只有当我在 Collection1 中滚动时它才会一起滚动。

是否可以像应用商店的索引轮播标题一样使标题视图随用户滚动?

或者我只是去错了地方,我应该用其他方式接近。

【问题讨论】:

  • 你想让collectionView2垂直滚动吗?如果不禁用,则垂直滚动仅适用于 tableView
  • "UITableView 里面可以滚动 UICollectionView 吗?"是的当然。让第一个集合视图位于标题而不是单元格中的原因是什么?你的目标是让它保持粘性(滚动表格视图时不移动)?
  • 将高度常量 > 0 赋予表格视图单元格内的集合视图,现在当您将数据设置到集合视图(重新加载后)时,设置高度常量与集合视图的内容 size.height 相同

标签: ios swift uitableview uiscrollview


【解决方案1】:

解决方案

  • 当您将 CollectionView1 保留为 TableViewHeader 时,CollectionView1 在到达顶部后将始终位于 TableView 的顶部。如果希望 Collection1 和 Collection2 一起向上滚动,则需要将 CollectionView1 保留在单元格中,而不是标题中。

  • 确保 CollectionView2 的内容高度小于或等于 TableViewCell 的高度。正如我在 App Store 上检查的那样,他们总是使 SubCollectionView 内容高度等于 TableViewCell 的高度(如果他们使用 TableView)。

结果

更多细节,你可以看看我的示例项目

https://github.com/trungducc/stackoverflow/tree/app-store-header

【讨论】:

  • 他的问题是UICollectionView,位于UITableViewCell 内部,有vertical 滚动,所以显然它不起作用。因为当他滚动UICollectionView - UITableView 时不会滚动
  • 确保 CollectionView2 的内容高度小于或等于 TableViewCell 的高度。 我是不是忘了给出解决方案? @TarasChernyshenko
【解决方案2】:

问题

1) 你的 tableview 单元格 Collectionview(比如说 collection2),Collection 2 是可滚动的。所以当你向上滚动时,tableview 不会向上滚动

解决方案

1) 简单且可行的解决方案是 height constant ,您必须通过 = 关系为 collection2 提供高度常数,并且0 恒定值和 750 优先级!!

现在的问题是如何使用它

您需要将高度常量 IBOutlet 带到您的自定义表格视图单元格中,并且需要从那里管理集合视图高度。

这里是例子

class FooTableViewCell: UITableViewCell {


    static let singleCellHeight = 88;

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var iconsCollectionView: IconsCollectionView!
    @IBOutlet weak var const_Height_CollectionView: NSLayoutConstraint!

    var delegateCollection : TableViewDelegate?

var bars:[Bar] = [] {
        didSet {
            self.iconsCollectionView.reloadData()
            iconsCollectionView.setNeedsLayout()
            self.layoutIfNeeded()

            let items:CGFloat = CGFloat(bars.count + 1)
            let value = (items / 3.0).rounded(.awayFromZero)

            const_Height_CollectionView.constant =  CGFloat((iconsCollectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize.height * value)

            self.layoutIfNeeded()
        }
    }

    override func awakeFromNib() {
        iconsCollectionView.translatesAutoresizingMaskIntoConstraints = false
        iconsCollectionView.initFlowLayout(superviewWidth: self.frame.width)
        iconsCollectionView.setNeedsLayout()
        iconsCollectionView.dataSource = self
        iconsCollectionView.delegate = self
        const_Height_CollectionView.constant =  iconsCollectionView.contentSize.height
        self.layoutIfNeeded()
        self.setNeedsLayout()
    }
}

您可以查看我的回答 Making UITableView with embedded UICollectionView using UITableViewAutomaticDimension 非常相似且 100% 有效

另一种解决方案您还可以将UICollectionView 与包含另一个水平collectionview 的部分一起使用,使用此解决方案您无需管理每个单元格的内容大小

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 2018-11-02
    • 2019-09-28
    • 1970-01-01
    • 2020-09-17
    • 2018-12-24
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多