所以我一直在更新我为 iOS 8 维护的应用程序,但我在 iOS 7 中遇到了使用 iOS 7 SDK 时没有的问题。
如果我根本不触及代码,当代码调用 layoutSubviews
时,它会在循环中结束操作(90% CPU 不停止)。当我播放和暂停时它会发生一些变化,但 validateLayoutInRect:
似乎总是在那里。
当我在 layoutIfNeeded
中更改 layoutSubviews
时,它通过了,但在调用以下行后以非常相似的方式卡住了:
[collectionView layoutAttributesForItemAtIndexPath:indexPath];
更新:在父 View 上启用和设置自动布局使其也通过 layoutSubviews
,这部分问题可能与 xibs 中的自动布局有关,但与 xibs 中的自动布局无关托管 View Controller
对我来说,它似乎卡在了计算大小、更改触发重新计算的内容等方面。奇怪的是,它不会发生在 iOS 7 SDK -> iOS 7 手机和 iOS 8 SDK -> iOS 8 手机或 iOS 7 SDK -> iOS 8 手机上。
我尝试将 NSLog 消息放在它可以再次出现在我的代码中的不同位置,但没有在循环中调用任何东西。 Collection View 通过重复使用 .xib 文件来填充。我想重建它以仅使用 Storyboard,但它是一个非常复杂的屏幕,此时我实际上不确定这真的是我的错误还是 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 的值都可能不是我想要的,而是放入单元格框架高度。在这种情况下,我需要的任何地方都可以使用!
大部分不是我的代码,不要因为到处都是老式的 CGRects 风格而打我耳光 ;)
我注意到它被否决了两次。请告诉我这个有效答案有什么问题。
关于objective-c - 自从我开始使用 iOS 8 SDK 以来,UICollectionView 在 iOS 7 中陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26001028/