为什么UICollectionView在单元格全屏时logging错误?

我有一个使用UICollectionViewFlowLayout ,其中我的itemSizeitemSize的大小。 基本上,这是每个单元格全屏并水平滚动的单元格的行布局。

在我的UICollectionViewFlowLayout子类中,我重写了prepareLayout ,如下所示:

 - (void)prepareLayout { self.itemSize = self.collectionView.frame.size; self.scrollDirection = UICollectionViewScrollDirectionHorizontal; self.collectionView.pagingEnabled = YES; self.minimumLineSpacing = 0.0; self.minimumInteritemSpacing = 0.0; self.sectionInset = UIEdgeInsetsZero; self.footerReferenceSize = CGSizeZero; self.headerReferenceSize = CGSizeZero; } 

UICollectionViewController是非常基本的在一个部分返回10个项目。 我已经在GitHub上包含了一个示例项目来获取更多细节。

一切似乎设置正确。 它在模拟器和设备上看起来是正确的,但是当收集视图显示时,会有一个错误logging到控制台:

 the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less that the height of the UICollectionView minus the section insets top and bottom values. 

还要注意,在我的例子中的集合视图控制器是在导航控制器中,虽然在示例中看起来并不是特别必要,但在我的实际情况下,我需要导航控制器中的集合视图。

UIViewController上有一个属性 – automaticallyAdjustsScrollViewInsets – 默认为YES 。 这意味着,当一个UIViewController在其视图层次结构中具有一个UIScrollViewUICollectionViewController为真)时,该滚动视图的contentInset属性会自动调整,以考虑状态栏,导航栏和工具栏或标签栏占用的屏幕区域。

该财产的文件指出:

automaticallyAdjustsScrollViewInsets

指定视图控制器是否应该自动调整其滚动视图插图。

@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets

讨论

默认值为YES,允许视图控制器响应状态栏,导航栏和工具栏或选项卡栏所消耗的屏幕区域来调整其滚动视图插图。 如果您想自己pipe理滚动视图插入调整(例如视图层次结构中有多个滚动视图),请将其设置为NO。

解决方法是automaticallyAdjustsScrollViewInsets设置UICollectionViewController子类中的任何地方,例如在viewDidLoad ,将UICollectionViewController设置为NO

 - (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO; } 

我已经在GitHub上放置了一个示例项目来说明这个问题和解决scheme。 有两个分支: with_errorfixed_error 。 这是GitHub上的变化的差异 。

ios 10:最上面的视图没有连接到视图sockets

这个问题刚刚发生在我的3倍屏幕上(即iPhone 6 Plus)。事实certificate,自动布局引擎并不是真的喜欢无限的浮点值(比如.33333333),所以我的解决方法是将返回高度sizeForItemAt:indexPath:

 return CGSize(width: preferredWidth, height: floor(preferredHeight))