调整某些值时,集合视图标题会闪烁

时间:2018-04-24 03:16:58

标签: ios swift uicollectionview

我有一个自定义的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。注意它是如何开始很好并开始闪烁。快速滚动也会产生不良影响。

enter image description here

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

看起来您的集合视图会将标题移到后面。

尝试在您要更改标题框架的代码中插入此内容:

@BeforeClass
public void test() {
    browserLaunch("chrome");
    Url_selection("http://www.globalsqa.com/", 60); 

答案 1 :(得分:1)

我认为您的问题与布局代码无关。我复制并尝试在一个简单的示例应用程序中使用CustomLayout,没有明显的闪烁问题。

其他尝试:

  1. 使用collectionView(viewForSupplementaryElementOfKind:at:)确保您的collectionView.dequeueReusableSupplementaryView(ofKind:withReuseIdentifier:for:)功能正确重用标题视图。每次创建一个新的标题视图都可能导致严重的延迟。
  2. 您是否在单元格中有任何复杂的绘图代码?
  3. 最糟糕的情况是,您可以尝试使用Instruments Time Profiler分析应用程序,以查看哪些操作占用了最多的CPU周期(假设丢帧是您的问题)。