2013-04-15 58 views
52

我正在使用UICollectionView使用流布局。 我为此做了一个自定义UICollectionViewCell。 但在运行控制台不断抛出此项目无差错UICollectionView布局问题

UICollectionViewFlowLayout的行为没有定义的,因为: 项目高度必须小于顶部UICollectionView减去部分插图和谷值的高度。

我已经确定了细胞的大小是正确

有没有人能解决这个问题。 在此先感谢。

问候 Nitesh

+0

请添加一些关于flowLayout.itemSize,collectionView.fram的信息!旋转或viewDidLoad时崩溃? – Alex

+7

我发现只有当我选择滚动方向为水平时才会出现此错误。 – Nitesh

+1

它不会崩溃只是UI变空白。 这是单元格的大小。 300X460 收藏查看框架-300X480 布局框架-300X480 我已将xib中的所有这些值取入 我希望收藏视图水平滚动而不是垂直滚动。 – Nitesh

回答

18

试图创建全屏细胞收集意见时,本来这个问题我自己几次。我的问题是由IB/Storyboard中4英寸屏幕的布局以及指定320 * 568的项目大小引起的,但是使用3.5英寸屏幕(其高度为480)在模拟器中运行。解决方案是在代码如下:

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout; 
layout.itemSize = self.collectionView.frame.size; 

这可确保在运行时正确设置单元大小。

+2

为什么您将整个视图的大小指定为单个大小细胞 ? – expert

+1

我遇到了全屏单元格的问题。不确定OP是否也是如此,但这是您遇到此问题最明显的方式。 –

2

一定要为UICollectionView和UICollectionviewcell设置正确的自动调整掩码。 这个固定我的问题的iPhone 4仿真

+0

此外,在单元的contentView(或UITableViewCell的内容视图)上设置自动调整掩码可以帮助 –

36

我发现,使用storyboards,你必须去到storyboard并点击整体View Controller(认为应该以蓝色高亮显示),然后转到Attributes Inspector(第四屏幕右侧的标签),并取消选中“顶部酒吧”,“底部酒吧”和“不透明酒吧”。这为我解决了问题,并为我的同事解决了问题。

+6

这与代码中的等效内容相同吗? – Lucien

+0

我发现取消选中“调整滚动查看插页”删除了警告。 (在故事板中使用故事板,Autolayout) –

+0

不适合我... –

25

我在使用集合视图呈现全屏视图控制器时遇到了一些问题。

基本上在运行时,它会要求项目的规模和简单地返回集合视图的大小:如果您使用的是故事板和经销商的布局

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return self.collectionView.frame.size; 
} 
+4

这比我的回答要好,如果你想支持轮换 –

10

,调试这类问题真的很难...

我试图在iPhone上显示UICollectionViewCell全屏时出现类似的问题。

大部分的时间问题是与细胞的大小

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *) 

或直接在flowLayout.itemSize设置。

但...尝试:

  1. 选择的ViewController:

Selecting View Controller

  • 然后取消扩展边缘选项:
  • Disable Extend Edges Options

    而现在尝试设置您的自动布局构造aints。

    祝你好运。

    +0

    谢谢!这救了我 –

    21

    我知道这是一个非常晚的答复,但我也经历过这个。

    在我的视图控制器,我们称之为MyViewController我有一个使用自定义UICollectionViewCellUICollectionView。我正在执行方法collectionView:layout:sizeForItemAtIndexPath,在那里我返回一个取决于UICollectionView的高度的项目大小。

    MyViewController是在故事板中使用自动布局来控制UIViewController的高度。

    单元在纵向模式下看起来很好,但在横向模式下没有。

    我通过在viewWillLayoutSubviews方法内使我的UICollectionView无效UICollectionViewLayout解决了我的问题。

    - (void)viewWillLayoutSubviews { 
        [self.myCollectionView.collectionViewLayout invalidateLayout]; 
    } 
    

    早些时候,我曾试图布局内无效willAnimateRotationToInterfaceOrientation:duration,但没有奏效。原因可能是所有视图的大小都没有计算出来,所以我们必须等到autolayout完成它的魔术。我指的是this SO thread

    更新雨燕4.0:上述修正

    override func viewDidLayoutSubviews() { 
        super.viewDidLayoutSubviews() 
        self.myCollectionView.collectionViewLayout.invalidateLayout() 
        } 
    
    +0

    谢谢!经过数小时尝试不同的建议,这个简单的解决方案消除了我的布局警告 – iksnae

    +0

    @nitesh我的答案解决了你的问题btw? – Sajjon

    -3

    没有为我做。 我这个

    - (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; 
    } 
    
    +3

    这似乎是不完整的代码。退货声明在哪里?它只是CGSize(宽度,collectionView.frame.size.height)还是你改变了它? – Vive

    1

    我只是碰到了同样的错误消息固定的,但对我来说,问题是,当我从API接收到新数据,并试图刷新我的CollectionView,那个叫[collectionView reloadData] WASN的方法不会在主线程中调用它。

    希望这可以帮助别人......

    1

    我有同样的问题

    的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); 
    
    
    } 
    
    2

    对我来说,我使用AKPickerView这是给我喜欢这里提到的那些警告摆一个自定义的UIView内。我所做的所有消除警告的方法都是在属性检查器中为我的自定义UIView取消选中名为“AutoResize Subviews”的框。这让警告非常沉重,我认为我的记录器停止了工作。

    enter image description here

    3

    这固定我的问题:

    -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
    return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70); 
    } 
    

    U可以从顶部和底部此屏幕上看到的填充值:

    enter image description here

    0

    如果要加载的CollectionView通过容器视图+ UICollectionViewController,你可能已经在容器上设置了高度约束视图正在限制集合视图本身的高度。在我的情况下,我发现collectionView.contentSize比我在容器视图上设置的约束更高。

    显然这是一个边缘案例,但万一你有类似的设置,我想我会添加此评论。