我有一个自定义的UICollectionView布局,可在用户滚动时调整大小。随着标题在一点收缩,它开始闪烁。
我猜测问题是当标题缩小时,集合视图认为它不在帧中并且可能使其出列但它会计算出它在帧中并重新排队,这可能是导致闪烁的原因。 / p>
class CustomLayout: UICollectionViewFlowLayout, UICollectionViewDelegateFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let layoutAttributes = super.layoutAttributesForElements(in: rect) as! [UICollectionViewLayoutAttributes]
let offset = collectionView!.contentOffset ?? CGPoint.zero
let minY = -sectionInset.top
if (offset.y >= minY) {
let setOffset = fabs(170 - minY)
let extraOffset = fabs(offset.y - minY)
if offset.y <= 170 {
for attributes in layoutAttributes {
if let elementKind = attributes.representedElementKind {
if elementKind == UICollectionElementKindSectionHeader {
var frame = attributes.frame
frame.size.height = max(minY, headerReferenceSize.height - (extraOffset * 1.25))
frame.origin.y = frame.origin.y + (extraOffset * 1.25)
attributes.frame = frame
}
}
}
} else {
for attributes in layoutAttributes {
if let elementKind = attributes.representedElementKind {
if elementKind == UICollectionElementKindSectionHeader {
var frame = attributes.frame
frame.size.height = max(minY, headerReferenceSize.height - (setOffset * 1.25))
frame.origin.y = frame.origin.y + (setOffset * 1.25)
attributes.frame = frame
}
}
}
}
}
return layoutAttributes
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
}
这是显示行为的gif。注意它是如何开始很好并开始闪烁。快速滚动也会产生不良影响。
有什么建议吗?
答案 0 :(得分:1)
看起来您的集合视图会将标题移到后面。
尝试在您要更改标题框架的代码中插入此内容:
@BeforeClass
public void test() {
browserLaunch("chrome");
Url_selection("http://www.globalsqa.com/", 60);
答案 1 :(得分:1)
我认为您的问题与布局代码无关。我复制并尝试在一个简单的示例应用程序中使用CustomLayout,没有明显的闪烁问题。
其他尝试:
collectionView(viewForSupplementaryElementOfKind:at:)
确保您的collectionView.dequeueReusableSupplementaryView(ofKind:withReuseIdentifier:for:)
功能正确重用标题视图。每次创建一个新的标题视图都可能导致严重的延迟。