UIView容器内的UICollectionView:滚动后不会调用didSelectRowAtIndexPath

use*_*214 9 scroll didselectrowatindexpath ios uicollectionview swift

我在ViewController中嵌入了3个UIViews Header/Tabar/Container和ScrollView.所以这是我的结构:

在此输入图像描述

在ContainerView中我加载了一个UICollectionView(就像这样):

let controller = storyboard!.instantiateViewControllerWithIdentifier("myCollectionViewController") as! myCollectionViewController
controller.delegate = self

self.addChildViewController(controller)
controller.view.backgroundColor = UIColor.brownColor()
self.containerView.addSubview(controller.view)
controller.didMoveToParentViewController(self)
Run Code Online (Sandbox Code Playgroud)

一切正常,UICollectionView的每个单元都被加载,......唯一的问题是,所有隐藏的单元格(甚至隐藏的单元格的所有部分)都是不可选择的.我的意思是我的函数"didSelectRowAtIndexPath"不适用于第一个屏幕之外的每个像素.这是我的问题的一个方案:

这是我在滚动之前的内容(左边是方案,右边是我在屏幕上实际拥有的内容) - >这里一切正常:

在此输入图像描述

这是滚动后的内容(左边是方案,右边是我在屏幕上实际拥有的内容) - >只有滚动前显示的像素可以调用"didSelectRowAtIndexPath":

在此输入图像描述

问题在于self.view.frame不能很好地刷新.你知道我应该如何更改这个框架以及何时更改?

has*_*san 1

问题定义:

我们一直面临的情况是UIViewController,除了滚动视图之外,还显示标题和选项卡栏。问题是这些额外的视图减少了与我们的滚动条相关的区域(在本例中UICollectionView)。在小屏幕设备中,我们的滚动条将一次显示少量项目。

建议的解决方案:

让这些附加视图与滚动条项目一起滚动。

如何应用?!

实现这一目标的最方便的解决方案。出现在滚动视图本身中。例如UICollectionView,提供了随集合视图项滚动的补充元素(页眉和页脚)。将标题和选项卡栏移动到UICollectionView. 然后,在视图控制器中实现viewForSupplementaryElementOfKind

- (nonnull UICollectionReusableView *)collectionView:(nonnull UICollectionView *)collectionView viewForSupplementaryElementOfKind:(nonnull NSString *)kind atIndexPath:(nonnull NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header1" forIndexPath:indexPath];

    return reusableview;
}
Run Code Online (Sandbox Code Playgroud)

Interface Builder: 标题区域已经UICollectionView存在。但是,您需要通过界面生成器设置它的高度,以便在设计时出现。不要忘记为标题设置集合可重用视图标识符。

在此输入图像描述

注意:这还需要您做一些额外的工作才能在标题和 TabBar 上设置手势。

更新:

考虑删除标题和选项卡栏容器,并在运行时将其作为子视图重新添加到适当的位置。当单击 UICollectionView 选项卡时,将其传递到方法中的标题可重用视图viewForSupplementaryElementOfKind。当单击标签选项卡时,将其添加到标签容器视图的顶部。当它是一个表视图时,将其传递给 headerForRow 方法中的 UITableView 标头。