Objective c 自从我开始使用iOS 8 SDK以来,UICollectionView在iOS 7中一直处于无限循环中
因此,我一直在更新一个为iOS 8维护的应用程序,但我在iOS 7中遇到了使用iOS 7 SDK时没有遇到的问题 如果我根本不碰代码,当代码调用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
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而责骂我;)
我注意到它两次被否决。请告诉我这个工作答案有什么问题