Objective c iOS 6.0:UICollectionView不';t使用PaginEnabled尊重clipsToBounds
背景 我正在实现一个Objective c iOS 6.0:UICollectionView不';t使用PaginEnabled尊重clipsToBounds,objective-c,ios6,Objective C,Ios6,背景 我正在实现一个UICollectionView(这是我第一次)以实现分页的平铺水平滚动视图。我希望每个互动程序都显示在框架的中心,其姊妹互动程序的左右部分可见(类似于Safari应用程序中的页面选择器)。我对使用UICollectionView来利用内置的单元出列感兴趣,而不是使用旋转的UITableView 问题 我发现的问题是,当使用paginabled=YES和clipsToBounds=NO时,UICollectionView会在分页完成后立即删除collectionView框架之
UICollectionView
(这是我第一次)以实现分页的平铺水平滚动视图。我希望每个互动程序都显示在框架的中心,其姊妹互动程序的左右部分可见(类似于Safari应用程序中的页面选择器)。我对使用UICollectionView
来利用内置的单元出列感兴趣,而不是使用旋转的UITableView
问题
我发现的问题是,当使用paginabled=YES
和clipsToBounds=NO
时,UICollectionView
会在分页完成后立即删除collectionView
框架之外的单元格(它们不在visibleCells
数组中)。有没有人能提供一些建议,说明如何在维护这个基本设置的同时实现显示姐妹互动程序预览的效果?还是我处理得不对
屏幕截图
开始
滚动
结束
滚动屏幕完全正确。但是在开始和结束的镜头中,我希望在蓝色的空白处可以看到绿色
以下是我的AppDelegate.m中的内容(这里的基本设置归功于):
我不是collectionView方面的专家,但这可能与cellForItemAtIndexPath中的这一行有关:
[cell.contentView addSubview:label];
每次调用它时,都会向单元格中添加另一个标签子视图。检查现有标签或子类UICollectionViewCell?结果表明,解决此问题的方法实际上非常简单。我只需要将
UICollectionViewCell
单元格重叠足够的像素,使它们在分页滚动完成后仍显示在collectionView的框架内。相关代码为
layout.itemSize = CGSizeMake(300, 300);
layout.minimumLineSpacing = -20.0;
我对
UICollectionViewFlowLayout
进行了子类化,并重写了(CGSize)collectionViewContentSize
方法,以返回单元格的非重叠大小。非常感谢关于使用负最小线间距的提示。我创建了一个tester应用程序,它使用从xib文件加载的集合视图单元格。该单元格具有透明背景和单元格内容的“内部”视图
这样,就不需要自定义流布局
您还需要覆盖
-pointInside:withEvent:
,以允许滚动手势在集合视图的框架之外启动。我使用集合视图子类中的UIEdgeInsets
属性执行此操作:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGRect extendedBounds = UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets);
return CGRectContainsPoint(extendedBounds, point);
}
如果您不需要应用商店安全,您可以覆盖\u visibleBounds
以避免负面间距攻击:
- (CGRect)_visibleBounds {
return UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets);
}
如果您对代码大小没有太大的压力,并且需要应用商店的安全性,那么您也可以对
visibleBoundRects
进行子类化并可能重写,以获得相同的效果 谢谢!注释这一点根本不会影响剪裁区域,因此并不能解决核心问题,但很好地解决了这一问题。我们发现,在有6个或更多单元格之前,这一点是有效的,此时单元格开始消失,即使它们位于图幅内。当所讨论的手机位于两个相邻手机的后面时,就会发生这种情况(这是我们停止调查的地方)。我无法在iOS 8上、在新的iPhone尺寸上以及在支持自动布局的情况下做到这一点。
- (CGRect)_visibleBounds {
return UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets);
}