iOS 10中使用自定义单元格的collectionViewContentSize
在iOS 10之前,我有一个自定义表格视图,它只包含一个使用标准UICollectionViewFlowLayout的自定义单元的UICollectionView。 集合视图单元格的大小使用自动布局。 为了让表格单元格能够正确地resize,我必须find集合视图的内容大小,并在表格单元格的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; }
对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违反了一些道德规则? 有没有更好的方法来计算集合视图的内容大小,当它使用自我大小的单元格? 我宁愿不必从自动布局移动到在代码中进行这些大小的计算,但这当然是最糟糕的情况。
这仅仅是iPhone Plus设备的iOS10中的一个奇怪的错误。 我遇到了同样的问题,我的解决scheme是调用layoutIfNeeded
像这样:
func numberOfSections(in collectionView: UICollectionView) -> Int { collectionView.layoutIfNeeded() // Patch: only to solve UIKit crash on Plus models return 1 }
在不同的UICollectionViewDataSources方法中做同样的事情也会起作用
在iOS 10上开发我的应用程序时遇到同样的问题。删除第一行解决了我的问题。
self.collectionView.frame = CGRectMake(0, 0, targetSize.width, FLT_MAX); //Remove this
希望这个帮助!
就我而言,在布局之前调用invalidateLayout
是解决此问题的一种解决方法。
在UIViewController
子类中:
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() collectionView.collectionViewLayout.invalidateLayout() }
或者在UIView
子类中:
override func layoutSubviews() { super.layoutSubviews() collectionView.collectionViewLayout.invalidateLayout() }
在iOS 10上开发我的应用程序时,我遇到了同样的问题,并在awakeFromNib
UICollectionViewDataSource
设置为自己,如下所示:
override func awakeFromNib() { super.awakeFromNib() let layout = UICollectionViewFlowLayout() // set your layout collectionViewLayout = layout // set dataSource equal to self in here cause a crash dataSource = self }
然后我将UICollectionViewDataSource
设置代码移到layoutSubviews
,问题就解决了,如下所示:
override func layoutSubviews() { super.layoutSubviews() dataSource = self } override func awakeFromNib() { super.awakeFromNib() let layout = UICollectionViewFlowLayout() // set your layout collectionViewLayout = layout // set dataSource equal to self in here cause a crash dataSource = self }
希望这个帮助!
- 在DrEdit中列出来自Google云端硬盘的所有文件和文件夹
- 如何stream式传输/下载和播放来自URL的audio?
- IOS – React Native – 未处理的JSexception:SyntaxError
- tableView在执行didSelectRowAtIndexPath之前由于一个gestureRecognizer而隐藏
- 从xcode命令行生成ipa
- 这是检测iPad的正确方法吗?
- iOS 7应用程序崩溃EXC_CRASH(SIGABRT)objc_exception_throw在iOS 6上正常工作
- 如何在Xcode 7上模拟UITest中的数据?
- 如何在iOS中将图像转换为二进制格式?