在iOS 10之前,我有一个自我调整表视图,它只包含一个UICollectionView,其中包含使用标准UICollectionViewFlowLayout的自调整单元格.使用自动布局调整集合视图单元格的大小.为了使表格单元格正确调整大小,我必须找到集合视图的内容大小,并在表格单元格的systemLayoutSizeFittingSize中使用它:withHorizontalFittingPriority:verticalFittingPriority:.
我还发现对collectionView.collectionViewLayout.collectionViewContentSize的调用使用了estimatedItemSize而不是正确大小的单元格大小,除非我调用了collectionView layoutIfNeeded.这导致systemLayoutSizeFittingSize:
- (CGSize) systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
{
self.collectionView.frame = CGRectMake(0, 0, targetSize.width, FLT_MAX);
[self.collectionView layoutIfNeeded];
CGSize collectionViewContentSize = self.collectionView.collectionViewLayout.collectionViewContentSize;
CGFloat verticalPadding = fabs(self.collectionViewTopPaddingConstraint.constant) + fabs(self.collectionViewBottomPaddingConstraint.constant);
CGSize cellSize = CGSizeMake(collectionViewContentSize.width, collectionViewContentSize.height + verticalPadding);
return cellSize;
}
Run Code Online (Sandbox Code Playgroud)
对layoutIfNeeded的调用现在导致了 *** Assertion failure in -[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:invalidationContext:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UIFlowLayoutSupport.m:823
我是否通过在systemLayoutSizeFittingSize中调用layoutIfNeeded来违反某些道德规则?在使用自定义单元格时,是否有更好的方法来计算集合视图的内容大小?我宁愿不必从自动布局转移到代码中进行这些大小计算,但这肯定是最糟糕的选择.
该应用程序是使用 Xcode 7.3.1 以 Swift 2.2 编写的。
我有一个带有水平的UITableView单元格。当我非常快速地上下滚动表格视图并且不让它在设备(iPad Air 2,iOS 9.3.2)或模拟器上停止时,应用程序崩溃UICollectionViewFlowLayout
EXC_BAD_ACCESS
Run Code Online (Sandbox Code Playgroud)
在 AppDelegate 中。
该应用程序未达到在视图控制器中设置的断点didReceiveMemoryWarning()。
似乎代码崩溃了
[UICollectionViewData invalidateItemsAtIndexPaths:]
Run Code Online (Sandbox Code Playgroud)
或者
[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:]
Run Code Online (Sandbox Code Playgroud)
其次是
0_dispatch_barrier_async_f_slow.
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪不会将我指向任何应用程序代码行。
模拟器的控制台堆栈跟踪(在设备上崩溃时没有控制台堆栈跟踪):
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[_UIFlowLayoutItem frame]: unrecognized selector sent to class 0x110f9ecc0'
*** First throw call stack:
(
0 CoreFoundation 0x000000011259cd85 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x00000001137d3deb objc_exception_throw + 48
2 CoreFoundation 0x00000001125a5c3d +[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00000001124ebcfa ___forwarding___ + 970 …Run Code Online (Sandbox Code Playgroud)