ios - 在 UIScrollView 嵌套的 UICollectionView 之间连续垂直滚动

标签 ios objective-c uiscrollview uicollectionview ios8

虽然我知道嵌套的 ScrollView 并不理想,但我们的设计师为我提供了这个设置,所以我正在尽我所能让它发挥作用。让我们开始吧!

查看层次结构

  • 界面 View
    • UIScrollView(仅限垂直滚动)
      • 界面 ImageView
      • UICollectionView #1(仅限水平滚动)
      • UIImageView(不同于之前的UIImageView)
      • UICollectionView #2(仅限垂直滚动)

重要提示

我所有的 View 都是使用程序化自动布局定义的。 UIScrollView 的 subview 层次结构中的每个连续 View 都依赖于它之前出现的 View 的 y 坐标。

问题

为了简单起见,让我们稍微修改一下命名法:

  • _outerScrollView将引用UIScrollView
  • _innerScrollView将引用UICollectionView #2

我想要我的 _outerScrollView将其触摸事件路由到 _innerScrollView到达其 contentSize 的底部时。当我向上滚动时,我希望发生相反的情况。

目前我有如下代码:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat bottomEdge = [scrollView contentOffset].y + CGRectGetHeight(scrollView.frame);
    if (bottomEdge >= [_outerScrollView contentSize].height) {
        _outerScrollView.scrollEnabled = NO;
        _innerScrollView.scrollEnabled = YES;
    } else {
        _outerScrollView.scrollEnabled = YES;
        _innerScrollView.scrollEnabled = NO;
    }
}

初始条件(在发生任何滚动之前)设置为:

outerScrollView.scrollEnabled = YES;
innerScrollView.scrollEnabled = NO;

会发生什么?

触摸 View 后,outerScrollView滚动到其底部边缘,然后由于 _outerScrollView.bounces = YES; 而具有橡皮筋效果如果我再次触摸 View ,innerScrollView 会滚动直到它到达底部边缘。在返回的路上,同样的橡皮筋效应以相反的顺序发生。我想要发生的是在两个 subview 之间进行流畅的运动。

显然,这是由于 scrollEnabled在代码段的条件中设置的条件。我想弄清楚的是如何在到达边缘时将一个 scrollView 的速度/速度路由到下一个 scrollView。

在此问题上的任何帮助将不胜感激。

其他注意事项

  1. 这对我不起作用:https://github.com/ole/OLEContainerScrollView
  2. 我正在考虑将 UIScrollView 层次结构中的所有内容(UICollectionView #2 除外)放入 UICollectionView #2 supplementaryView .不确定这是否可行。

最佳答案

想通了!

首先:

_scrollView.pagingEnabled = YES;

第二个:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == _scrollView || scrollView == _offersCollectionView) {

        CGFloat offersCollectionViewPosition = _offersCollectionView.contentOffset.y;
        CGFloat scrollViewBottomEdge = [scrollView contentOffset].y + CGRectGetHeight(scrollView.frame);

        if (scrollViewBottomEdge >= [_scrollView contentSize].height) {
            _scrollView.scrollEnabled = NO;
            _offersCollectionView.scrollEnabled = YES;
        } else if (offersCollectionViewPosition <= 0.0f && [_offersCollectionView isScrollEnabled]) {
            [_scrollView scrollRectToVisible:[_scrollView frame] animated:YES];
            _scrollView.scrollEnabled = YES;
            _offersCollectionView.scrollEnabled = NO;
        }
    }
}

地点:

  • _scrollView_outerScrollView
  • _offersCollectionView_innerScrollView(在我的原始帖子中是 UICollectionView #2)。

这是现在发生的事情:

  • 当我向上滑动(因此 View 向下移动)时,offersCollectionView 接管整个 View ,将其他 subview 移出 View 。
  • 如果我向下滑动(因此 View 向上),其余 subview 将通过 scrollView 的弹跳效果重新聚焦。

关于ios - 在 UIScrollView 嵌套的 UICollectionView 之间连续垂直滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793141/

相关文章:

iphone - 如何将 UIControl 添加到 UIScrollView contentView?

uiscrollview - 在 iOS 5 模拟器上运行时,使用 iOS 6.0 SDK 和构建 iOS 5 Target 会导致 UIScrollView setMinimumZoomScale 失败

iphone - UIScrollView中如何实现水平分页而不垂直分页

ios - 由于 'internal' 保护级别,初始化程序无法访问 - Swift 4 iOS

ios - 将 SwiftUI View 渲染为 UIImage

ios - Swift 2 核心位置不起作用

ios - 声音是来自iphone还是 watch ?

ios - 哪种方法是添加UIView subview 的正确方法

iphone - 警告 : class implemented in both SDK

objective-c - 如何从 iPad 发送 SMS(文本消息)