我的顶部有一个水平CollectionView
,下面有一个TableView
我想在滚动TableView
时CollectionView
上滚动并设置动画,使其达到scrollItemTo
所达到的水平,但是CollectionView
滚动时会变慢,但我希望它能正常工作在餐厅项目列表详细信息的 uberEats iOS应用中工作,并且在 urbanClap 应用
这就像在表格视图部分标题到达顶部时逐格移动视图单元格一样
答案 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)
}
}
}
更改选择的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)