objective-c - 自从我开始使用 iOS 8 SDK 以来,UICollectionView 在 iOS 7 中陷入无限循环

标签 objective-c iphone ios7 ios8

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

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

enter image description here

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

[collectionView layoutAttributesForItemAtIndexPath:indexPath];

enter image description here

更新:在父 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/

相关文章:

iOS7 自动布局、 View 调整大小和 iAds

xcode - 优选内容大小不会缩小

objective-c - 将 NSTableView 连接到 XML-RPC 服务器

ios - 在隐藏导航栏的 ViewController 之间跳转

iphone - 文件管理器 - 找不到文件 - Objective C

ios - iOS 8 发布后,已发布的应用程序运行异常

iphone - 如何调整表格 View 布局?

iphone - 如何为索引栏后面的 tableviewcell 区域着色?

iphone - 如何从照片库加载照片并将其存储到应用程序项目中?

ios - Apple 二进制文件被拒绝 (2.16)