我有两个UICollectionVews
其中一个(父级)是一个全屏单元格的分页集合视图。
另一个(孩子一个)是"页面内的过滤器" 两者都有相同的滚动方向
我的问题是,当我滚动孩子一个,它到达结束时,父母开始移动。我想避免这种情况。我尝试了很多东西
* ScrollView委托 *的touchesBegan
有什么想法吗? 谢谢!
答案 0 :(得分:0)
我觉得这很容易。 设置父UICollectionView
console.log(`|${graphTitle.style.fontSize}|`); //outputs ||
或者听起来不合理。如果父UICollectionView可以滚动,您如何归档目标?因为UICollectionView由单元格组成(子单元格)。单元格将不可避免地影响父UICollectionView。
也许孩子一个位于单元格的一部分,你可以使用
collectionView.scrollEnabled = NO;
的方法:UIScrollViewDelegate
,用于设置父collectionView的scrollViewDidScroll
属性。
答案 1 :(得分:0)
我认为你更喜欢这个答案。 我们知道泛手势识别器是在UIScrollView中构建的。 我们可以添加其他协调的平移手势。
因为苹果说:' UIScrollView的内置平移手势识别器必须有它的 滚动视图作为其代理。'
let pan = UIPanGestureRecognizer(target: self, action: #selector(ViewController.panGestureRecognizerAction(recognizer:)))
pan.delegate = self
mainScrollView.addGestureRecognizer(pan)
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
// So we can get the argus of the pan gesture while not affecting the scroll
after the setting.
var mainScrollEnabled = false
var subScrollEnabled = false
// Then we define two BOOL values to identify the scroll of the collectionView
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == mainScrollView {
if scrollView.contentOffset.y >= maxOffsetY {
scrollView.setContentOffset(CGPoint(x: 0, y: maxOffsetY), animated: false)
mainScrollView.isScrollEnabled = false
subScrollView.isScrollEnabled = true
subScrollEnabled = true
mainScrollEnabled = false
}
}else {
if scrollView.contentOffset.y <= 0 {
scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
subScrollView.isScrollEnabled = false
mainScrollView.isScrollEnabled = true
mainScrollEnabled = true
subScrollEnabled = false
}
}
}
// Then we handle the situation that the collectionView reaches the end , by the pan gesture's recognizer .
var currentPanY: CGFloat = 0
func panGestureRecognizerAction(recognizer: UIPanGestureRecognizer) {
if recognizer.state != .changed{
currentPanY = 0
// clear the data of last time after finishing the scroll
mainScrollEnabled = false
subScrollEnabled = false
}else {
let currentY = recognizer.translation(in: mainScrollView).y
// So the collectionView reaches the end.
if mainScrollEnabled || subScrollEnabled {
if currentPanY == 0 {
currentPanY = currentY //get the y
}
let offsetY = currentPanY - currentY //get the offsetY
if mainScrollEnabled {
let supposeY = maxOffsetY + offsetY
if supposeY >= 0 {
mainScrollView.contentOffset = CGPoint(x: 0, y: supposeY)
}else {
mainScrollView.contentOffset = CGPoint.zero
}
}else {
subScrollView.contentOffset = CGPoint(x: 0, y: offsetY)
}
}
}
}