我正在使用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
(屏幕右侧的第四个标签)并取消选中“在顶栏“,”在底栏下“和”在不透明栏下“。这为我解决了这个问题,它也为我的同事清除了它。
我有同样的问题
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高于我在容器视图上设置的约束。
显然这是一个边缘情况,但万一你有类似的设置,我想我会添加这个评论。
造成这种情况的原因是我试图将我的细胞设置为超视图的大小,而不是UICollectionView
的大小。只需用UICollectionView
框架替换superview框架。
上述修复都没有为我做过。我用它修好了
- (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;
}
当使用集合视图呈现全屏视图控制器时,我遇到了一些问题。
基本上在运行时,它会询问项目的大小,并简单地返回集合视图的大小:
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return self.collectionView.frame.size;
}
我知道这是一个非常晚的回复,但我也经历过这个。
在我的视图控制器中,我们称之为MyViewController我有一个使用自定义UICollectionView
s的UICollectionViewCell
。我正在实施方法collectionView:layout:sizeForItemAtIndexPath,我返回的项目大小取决于UICollectionView
的高度。
MyViewController是在故事板中使用autolayout来控制UIViewController
的高度。
在纵向模式下,单元格看起来很好,但在横向模式下则没有。
我通过在UICollectionViewLayout
方法中使我的UICollectionView
的viewWillLayoutSubviews
无效来解决我的问题。
- (void)viewWillLayoutSubviews {
[self.myCollectionView.collectionViewLayout invalidateLayout];
}
之前我曾尝试使willAnimateRotationToInterfaceOrientation:duration
中的布局无效,但它没有用。原因可能是所有视图的大小尚未计算,所以我们必须等到自动布局完成它的魔力。我指的是this SO thread。
Swift 4.0的更新:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.myCollectionView.collectionViewLayout.invalidateLayout()
}
尝试使用全屏单元格创建集合视图时,我自己有几次这个问题。我的问题是由于在IB /故事板中布置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模拟器的问题
我刚刚遇到了同样的错误消息,但对我来说问题是,当我从api收到新数据并尝试刷新我的collectionView时,调用[collectionView reloadData]
的方法没有在主线程上调用它。
希望这有助于某人......