Objective c 自从我开始使用iOS 8 SDK以来,UICollectionView在iOS 7中一直处于无限循环中

Objective c 自从我开始使用iOS 8 SDK以来,UICollectionView在iOS 7中一直处于无限循环中,objective-c,iphone,ios7,ios8,Objective C,Iphone,Ios7,Ios8,因此,我一直在更新一个为iOS 8维护的应用程序,但我在iOS 7中遇到了使用iOS 7 SDK时没有遇到的问题 如果我根本不碰代码,当代码调用layoutSubviews时,它会以循环结束(90%CPU不停止)。当我播放和暂停时,它会发生一些变化,但validateLayoutInRect:似乎总是在那里 当我在layoutfneed中更改layoutSubviews时,它会通过,但在调用以下行后会以非常类似的方式卡住: [collectionView layoutAttributesFor

因此,我一直在更新一个为iOS 8维护的应用程序,但我在iOS 7中遇到了使用iOS 7 SDK时没有遇到的问题

如果我根本不碰代码,当代码调用
layoutSubviews
时,它会以循环结束(90%CPU不停止)。当我播放和暂停时,它会发生一些变化,但
validateLayoutInRect:
似乎总是在那里

当我在
layoutfneed
中更改
layoutSubviews
时,它会通过,但在调用以下行后会以非常类似的方式卡住:

[collectionView layoutAttributesForItemAtIndexPath:indexPath];

更新:在父视图上启用和设置自动布局也会使其通过
layoutSubviews
,这部分问题可能与xibs中的自动布局有关,但与宿主视图控制器上的自动布局无关

在我看来,它似乎陷入了计算大小的困境,改变了一些触发重新计算的东西,等等。奇怪的是,iOS 7 SDK->iOS 7 phone和iOS 8 SDK->iOS 8 phone以及iOS 7 SDK->iOS 8 phone都没有出现这种情况


我尝试将NSLog消息放在不同的位置,它可能会再次出现在我的代码中,但在循环中没有调用任何东西。集合视图通过重用.xib文件来填充。我想重建它,只使用故事板,但它是一个非常复杂的屏幕,在这一点上,我实际上不确定这是我的错误还是SDK中的错误。

当我在Xcode 6.1中使用iOS 8.1 SDK编译时,事情已经好多了。但仍然有一个屏幕崩溃。最终,我发现一些单元格最终达到了MAXFLOAT高度,在应用该高度之前,我需要添加一个健全性检查:

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    Class class = [[self dataSource] cellClassForIndexPath:indexPath];
    NSString *classString = NSStringFromClass(class);
    UICollectionViewCell *cell = [self sizingCells][classString];

    if (cell == nil)
    {
        cell = [class loadInstanceFromNib];
        [self sizingCells][classString] = cell;
    }

    [[self dataSource] configureCell:cell forIndexPath:indexPath excludeKeys:@[@"imageURL", @"image"]];

    CGSize fittingSize = CGSizeMake([collectionView frameSizeWidth], MAXFLOAT);
    CGSize size = [cell systemLayoutSizeFittingSize:fittingSize];

    if (size.height > 10000) { // Needed for iOS 8 SDK on iOS 7 device bug AMA-827
        size.height = cell.frame.size.height; // Ridiculous size detected, whipping
    }

    return CGSizeMake([collectionView frameSizeWidth], size.height);
}
我武断地认为任何超过10000的东西都可能不是我想要的,而是放在牢房的框架高度上。在任何我需要的地方都能用

大部分都不是我的代码,不要因为到处都是老式的CGRECT而责骂我;)


我注意到它两次被否决。请告诉我这个工作答案有什么问题