当我滚动UITableview时自动滚动UICollectionView

时间:2019-05-10 07:02:01

标签: ios uitableview uicollectionview scrollview swift4.2

我的顶部有一个水平CollectionView,下面有一个TableView 我想在滚动TableViewCollectionView上滚动并设置动画,使其达到scrollItemTo所达到的水平,但是CollectionView滚动时会变慢,但我希望它能正常工作在餐厅项目列表详细信息的 uberEats iOS应用中工作,并且在 urbanClap 应用

中工作

这就像在表格视图部分标题到达顶部时逐格移动视图单元格一样

3 个答案:

答案 0 :(得分:1)

您可以为tableView实现scrollViewDidScroll中的UIScrollViewDelegate,然后从此处手动滚动UICollectionView

class XYZ: UIViewController, UIScrollViewDelegate{

     func viewDidLoad(){
         super.viewDidLoad()
         tableView.delegate = self
     }


    func scrollViewDidScroll(_ scrollView: UIScrollView){
         let tableView = scrollView //assuming the only scrollView.delegate you conform to is the tableVeiw

         collectionView.contentOffset = someMappingFrom(tableView.contentOffset) //or some other scrolling mechanism (scrollToItem)
    }


}

答案 1 :(得分:1)

您正在引用的超级应用程序功能的工作原理是:每当tableView的特定部分到达顶部时,都会选择该特定的collectionViewCell

从以上陈述可以明显看出,

collectionView中的项目数= tableView中的部分数

通过跟踪tableView的顶部可见部分索引,然后在该特定索引处选择collectionViewCell,即可实现针对此特定问题的解决方案

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView === self.tableView {
        if
            let topSectionIndex = self.tableView.indexPathsForVisibleRows?.map({ $0.section }).sorted().first,
            let selectedCollectionIndex = self.collectionView.indexPathsForSelectedItems?.first?.row,
            selectedCollectionIndex != topSectionIndex {
            let indexPath = IndexPath(item: topSectionIndex, section: 0)
            self.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally)
        }
    }
}

enter image description here

更改选择的collectionViewCell颜色:

创建自定义UICollectionViewCell并覆盖**isSelected**属性以处理选定和未选定状态,即

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!

    override var isSelected: Bool {
        didSet {
            if self.isSelected {
                self.contentView.backgroundColor = #colorLiteral(red: 0.2588235438, green: 0.7568627596, blue: 0.9686274529, alpha: 1)
            } else {
                self.contentView.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
            }
        }
    }
}

此后,您无需在其他位置手动更新单元格的backgroundColor

答案 2 :(得分:0)

您需要在scrollViewDidScroll上更改选择。

我已将链接附加到相同代码的仓库

Github Repo for solution