UIView容器内的UICollectionView:滚动后没有调用didSelectRowAtIndexPath

时间:2015-08-07 14:18:34

标签: ios swift scroll uicollectionview didselectrowatindexpath

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

enter image description here

在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)

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

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

enter image description here

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

enter image description here

问题在于self.view.frame并不令人耳目一新。你知道我应该如何改变这个框架以及什么时候?

3 个答案:

答案 0 :(得分:3)

您必须定义滚动视图内容大小

为您的滚动视图创建一个插座

@IBOutlet weak var scrollview : UIScrollView!

使其高度等于标题,tabBar和容器的高度之和:

self.scrollView.contentSize = CGSizeMake(self.view.frame.width, header.frame.height + tabBar.frame.height + container.frame.height)

答案 1 :(得分:1)

问题定义:

除了滚动条视图外,我们所有遇到情况的都是UIViewController,显示标题和标签栏。问题是这些附加视图减少了与滚动条相关的区域(在本例中为UICollectionView)。在小屏幕设备中,我们的滚动条一次只显示少量项目。

建议的解决方案:

  

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

如何申请?

实现这一目标的最方便的解决方案。出现在Scroller视图中。例如,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;
}

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

enter image description here

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

<强>更新

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

答案 2 :(得分:0)

这似乎是你有mentioned in another question的另一个问题的延续。

查看故事板层次结构,我怀疑问题是,当您更改滚动视图内容大小和集合视图高度时,您不会更改tab bar view的高度。收藏视图仍然可见,可能是因为容器tab bar view没有剪辑内容(clipToBounds=false)。但由于视图本身并未延伸到远远低于该视图及其子视图,因此无法识别触摸。

确保主视图,滚动视图的内容视图(内容大小),标签栏视图和集合视图都已正确调整大小。由于您已决定不使用标准视图层次结构(补充视图或标题视图),因此您必须自己处理管理视图边界的开销。