[英]UICollectionView Layout Issue
我正在使用流布局使用UICollectionView
。 我为此制作了一个自定义UICollectionViewCell
。 但是在运行项目时,控制台不断抛出这个错误-
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.
我已经确定单元格的大小是正确的
有没有人能够解决这个问题。
我发现,使用storyboards
,您必须进入storyboard
并单击整个View Controller
(视图应以蓝色突出显示)并转到Attributes Inspector
(屏幕右侧的第四个选项卡)并取消选中“在顶部条下”、“在底部条下”和“在不透明条下”。 这为我解决了问题,也为我的同事解决了问题。
在使用集合视图呈现全屏视图控制器时,我遇到了一些问题。
基本上在运行时,它会询问项目的大小并简单地返回集合视图的大小:
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return self.collectionView.frame.size;
}
我知道这是一个很晚的回复,但我也经历过这种情况。
在我的视图控制器,让我们把它MyViewController我有一个UICollectionView
正在使用自定义的UICollectionViewCell
秒。 我正在实现方法collectionView:layout:sizeForItemAtIndexPath ,我返回一个依赖于UICollectionView
高度的项目大小。
MyViewController是在故事板中使用自动布局来控制UIViewController
的高度的。
单元格在纵向模式下看起来很好,但在横向模式下则不然。
我通过在viewWillLayoutSubviews
方法UICollectionViewLayout
的UICollectionView
无效来解决了我的问题。
- (void)viewWillLayoutSubviews {
[self.myCollectionView.collectionViewLayout invalidateLayout];
}
早些时候,我曾试图使willAnimateRotationToInterfaceOrientation:duration
的布局无效,但没有奏效。 原因可能是所有视图的大小都没有计算出来,所以我们必须等到自动布局完成它的魔力。 我指的是这个 SO 线程。
Swift 4.0 更新:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.myCollectionView.collectionViewLayout.invalidateLayout()
}
在尝试使用全屏单元格创建集合视图时,我自己也遇到过几次这个问题。 我的问题是由于在 IB/Storyboard 中布局 4" 屏幕并为项目大小指定 320*568,但在使用 3.5" 屏幕的模拟器中运行,其高度为 480。解决方案是在代码如下:
UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = self.collectionView.frame.size;
这可确保在运行时正确设置像元大小。
如果你正在使用故事板和自动布局,调试这类问题真的很难......
我在尝试在 iPhone 上全屏显示 UICollectionViewCell 时遇到了类似的问题。
大多数情况下,问题在于设置的单元格大小
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)
或直接在 flowLayout.itemSize 上。
但是...尝试:
现在尝试设置您的自动布局约束。
祝你好运。
确保为 UICollectionView 和 UICollectionviewcell 设置正确的自动调整大小掩码。 这解决了我的 iPhone 4 Simulator 问题
对我造成这种情况的原因是我试图将我的单元格设置为UICollectionView
的大小而不是UICollectionView
的大小。 简单地用UICollectionView
框架替换UICollectionView
框架。
我刚刚遇到了相同的错误消息,但对我来说,问题是当我从 api 接收新数据并尝试刷新我的 collectionView 时,调用[collectionView reloadData]
的方法没有在主线程上调用它。
希望这可以帮助某人...
我有同样的问题
UICollectionViewFlowLayout 的行为未定义,因为:项目高度必须小于 UICollectionView 的高度减去部分插入顶部和底部值。
我通过检查 Insets 部分中的值解决了这个问题。为了修复单元格大小,我使用了下面的代码。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width - 20;
CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120;
return CGSizeMake(cellWidth, cellHeight);
}
如果您通过容器视图 + UICollectionViewController 加载 collectionView,您可能已经在容器视图上设置了高度约束,该约束约束了集合视图本身的高度。 就我而言,我发现 collectionView.contentSize 比我在容器视图上设置的约束要高。
显然,这有点边缘情况,但以防万一您有类似的设置,我想我会添加此评论。
对我来说,解决方案是将集合视图的Estimate Size
(在故事板大小属性窗格中)设置为None
。
它抱怨项目高度大于 collectionView 的高度。 所以它突出了。 所以你必须使高度相同或更少。 像这样:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.frame.height, height: collectionView.frame.height)
}
使用高度作为宽度使其成为正方形。 这是假设 inset 是 0,如果你没有做任何事情,它应该是。
以上修复均不适合我。 我用这个修好了
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{CGFloat currentWidth = collectionView.frame.size.width;
UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout sectionInset]; //here the sectionInsets are always = 0 because of a timing issue so you need to force set width of an item a few pixels less than the width of the collectionView.
CGFloat width = currentWidth - 10;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.