为什么在集合视图中使用带有自调整大小的headerReferenceSize会导致iOS 8崩溃?

时间:2014-08-23 09:09:30

标签: layout uicollectionview ios8 xcode6-beta5

我设法找出the approach for self-sizing collection view cells under iOS 8

我想将此作为附件视图的一部分。

我崩溃了......堆栈跟踪的有趣部分如下:

** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(
  0   CoreFoundation    __exceptionPreprocess + 165
  1   libobjc.A.dylib   objc_exception_throw + 45
  2   CoreFoundation    -[__NSArrayM insertObject:atIndex:] + 954
  3   UIKit             -[UICollectionViewFlowLayout layoutAttributesForElementsInRect:] + 384
  4   UIKit             __45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 144
  5   UIKit             -[UICollectionViewData validateLayoutInRect:] + 1396
  6   UIKit             -[UICollectionView layoutSubviews] + 170
  7   UIKit             -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
  8   QuartzCore        -[CALayer layoutSublayers] + 150
  9   QuartzCore        _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
  10  UIKit             -[UIView(Hierarchy) layoutBelowIfNeeded] + 611
  11  UIKit             -[UIInputSetHostView layoutIfNeeded] + 105
  12  UIKit             __43-[UIInputWindowController setInputViewSet:]_block_invoke + 112
  13  UIKit             +[UIView(Animation) performWithoutAnimation:] + 65
  14  UIKit             -[UIInputWindowController setInputViewSet:] + 291
  15  UIKit             -[UIInputWindowController performOperations:withAnimationStyle:] + 50
  16  UIKit             -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1054
  17  UIKit             -[UIResponder becomeFirstResponder] + 468
  18  UIKit             -[UIView(Hierarchy) becomeFirstResponder] + 99
  19  UIKit             -[UITextView becomeFirstResponder] + 75
  ...

这看起来像是一个Apple bug。为什么布局似乎返回一个空的布局属性?

1 个答案:

答案 0 :(得分:1)

到目前为止,我最好的想法是基于此存储库:https://github.com/algal/SelfSizingCellsDemo

在ViewController.swift的第50行,我们有label.preferredMaxLayoutWidth = 320,它产生一个填充整个屏幕的单元格,如果有足够的文本则包装行。这需要更改以适合您正在使用的任何大小的屏幕。然后在每个部分之后,您需要添加足够的文本来填充该标签,就像在第20行let items = smallitems.componentsSeparatedByString(" ") + [onelongitem]上完成的那样

这种方法的问题在于,除了文本之外,我还不知道如何在该单元格中添加不同的视图。这可能适用于您的情况。