gpt4 book ai didi

ios - 处理嵌套 UIScrollView 中的冲突手势

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:44 49 4
gpt4 key购买 nike

所以我意识到嵌套 ScrollView 有点像一个危险信号,但除了一个小问题外,当前的所有设置实际上都运行良好。一个 ScrollView 管理在集合中的滚动,而另一个处理整个 Collection View 的缩放和平移。这一切都有效,但小问题来自于放大和向下平移时, ScrollView 平移,而 collectionview 滚动,导致 View 滚动速度加倍,并且感觉与手指不相连。

我最理想的情况是,当可以平移时,垂直滚动由外部 ScrollView 管理,然后当外部 ScrollView 无法平移时,由内部 ScrollView 处理。我通过写这样的东西非常接近:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == _outerScrollView) {
CGPoint offset = _outerScrollView.contentOffset;
CGFloat height = _outerScrollView.frame.size.height;
CGFloat contentHeight = _outerScrollView.contentSize.height;

ScrollDirection scrollDirection;
if (offset > _lastContentOffset){
scrollDirection = ScrollDirectionUp;
} else {
scrollDirection = ScrollDirectionDown;
}

BOOL scrollIsAtTop = offset.y <= 0;
BOOL scrollIsAtBottom = offset.y + height >= contentHeight;

//If there is a pan upward and we aren't at the top of the outer
//scrollview cancel the gesture on the inner view
//downward vice versa
if (!((scrollIsAtTop && scrollDirection == ScrollDirectionUp)
|| (scrollIsAtBottom && scrollDirection == ScrollDirectionDown))) {
_innerCollectionView.panGestureRecognizer.enabled = NO;
_innerCollectionView.panGestureRecognizer.enabled = YES;
}
}
_lastContentOffset = offset.y;
}

ALMOST 有效,但有一个副作用,即大平移向下移动时会在触及底部时停止,并要求用户开始新的手势以继续滚动内部集合。理想情况下,这种过渡会很顺利,但我很难找到一种方法来做到这一点。我再次意识到 ScrollView 内的 ScrollView 并不理想,但如果我能解决这个小问题,一切都会好起来的,而不是试图重新设计整个东西。

关于我如何以一种让平移手势获胜的方式处理双滚动,但在外部 ScrollView 不再垂直平移时干净地过渡到内部集合的任何想法?

最佳答案

因此,由于我从未得到任何答案,这就是我一直采用的解决方案。本质上,如果内部 Collection View 不在顶部或底部,我会重置外部 ScrollView 在 scrollViewDidScroll 中的 y 偏移量更改。代码如下所示:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == _outerScrollView) {
if (![self innerScrollIsAtTop] && ![self innerScrollIsAtBottom] && !self.allowOuterScroll) {
[scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, self.lastContentOffset)];
}
self.lastContentOffset = scrollView.contentOffset.y;
}
}

使用这两个便利:

- (BOOL)innerScrollIsAtTop {
return _innerCollectionView.contentOffset.y <= 0;
}

- (BOOL)innerScrollIsAtBottom {
CGFloat zoom = self.zoomScale;
CGFloat height = _innerCollectionView.frame.size.height;
CGFloat contentHeight = _innerCollectionView.contentSize.height;
CGPoint offset = _innerCollectionView.contentOffset;

return offset.y + height / zoom >= contentHeight;
}

并且你需要2个类变量,一个float用来保存外滚动之前的y内容偏移量,一个BOOL用来保存是否允许外 ScrollView 滚动,你可以设置为YES,而缩放或以编程方式滚动。此解决方案修复了双滚动,但在 scrollviewDidScroll 中确实有一个麻烦的 hack,以后可能会咬你,你经常需要变通,但现在这是我一直在使用的解决方案。

关于ios - 处理嵌套 UIScrollView 中的冲突手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155828/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com