我正在使用水平分页UICollectionView
来显示可变数量的集合视图单元格。每个集合视图单元的大小需要等于集合视图的大小,并且只要集合视图的大小发生更改,集合视图单元的大小就需要相应地更新。后者导致问题。当集合视图的大小发生更改时,不会更新集合视图单元格的大小。
使布局无效似乎没有办法。对UICollectionViewFlowLayout
进行子类化并覆盖shouldInvalidateLayoutForBoundsChange:
也不起作用。
为了您的信息,我正在使用UICollectionViewFlowLayout
的实例作为集合视图的布局对象。
答案 0 :(得分:1)
我认为下面的解决方案更清洁。您只需覆盖UICollectionViewLayout的方法之一,如:
- (void)invalidateLayoutWithContext:(UICollectionViewFlowLayoutInvalidationContext *)context
{
context.invalidateFlowLayoutAttributes = YES;
context.invalidateFlowLayoutDelegateMetrics = YES;
[super invalidateLayoutWithContext:context];
}
和
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
if(!CGSizeEqualToSize(self.collectionView.bounds.size, newBounds.size))
{
return YES;
}
return NO;
}
。
答案 1 :(得分:0)
我的应用程序中有类似的行为:UICollectionView
单元格应始终与集合视图具有相同的宽度。从true
返回shouldInvalidateLayoutForBoundsChange:
也不适用于我,但我设法让它以这种方式运作:
class AdaptableFlowLayout: UICollectionViewFlowLayout {
var previousWidth: CGFloat?
override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
let newWidth = newBounds.width
let shouldIvalidate = newWidth != self.previousWidth
if shouldIvalidate {
collectionView?.collectionViewLayout.invalidateLayout()
}
self.previousWidth = newWidth
return false
}
}
在文档中声明,当shouldInvalidateLayoutForBoundsChange
返回true
时,将调用invalidateLayoutWithContext:
。我不知道为什么invalidateLayout
有效且invalidateLayoutWithContext:
没有。
答案 2 :(得分:0)
Swift 4 Xcode 9实现的高度变化:
final class AdaptableHeightFlowLayout: UICollectionViewFlowLayout {
var previousHeight: CGFloat?
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
let newHeight = newBounds.height
let shouldIvalidate = newHeight != self.previousHeight
if shouldIvalidate {
collectionView?.collectionViewLayout.invalidateLayout()
}
self.previousHeight = newHeight
return false
}
}