gpt4 book ai didi

ios - UICollectionView 粘性标题在集合过度滚动时插入部分后消失一段时间(弹跳效果)

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:21 24 4
gpt4 key购买 nike

我正在使用 UICollectionReusableView 作为 UICollectionView 部分的 header 。我启用了“粘性标题”:

let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
layout?.sectionHeadersPinToVisibleBounds = true

我正在插入新的部分到集合中:

collectionView.performBatchUpdates({
self.collectionView.insertSections(IndexSet(integersIn: collectionView.numberOfSections...viewModel.numberOfSections - 1))
}, completion: nil)

如果插入发生在集合过度滚动(启用弹跳)时,标题将消失一段时间(请参见下面的 GIF)。 我怎样才能避免这种行为?

我使用的是 iOS 12.1.4,但同样的问题也发生在 iOS 11.x 和 12.x 模拟器上。

如果关闭反弹效果,问题就不会发生,但我想保持它打开以获得更平滑的滚动感。我在更新之前/之后尝试使布局无效,但没有结果。感谢您的建议。

enter image description here

编辑(2019 年 2 月 26 日)
解决方法:将插入包装到 performWithoutAnimation block 解决 header 消失但显然禁用重新加载动画。

UIView.performWithoutAnimation {
collectionView.performBatchUpdates({
self.collectionView.insertSections(IndexSet(integersIn: collectionView.numberOfSections...viewModel.numberOfSections - 1))
}, completion: nil)
}

最佳答案

不幸的是,通过调用 performBatchUpdates,布局会自动为所有项目本身设置动画。即使到现在,也没有办法明确地告诉哪些项目要设置动画,哪些不要。

但是,我提出了一种反模式的解决方案。

对于您的头类,覆盖这些方法:

       -(void)setBounds:(CGRect)bounds
{
[CATransaction begin];
[CATransaction setDisableActions:self.shouldDisableAnimations];
[super setBounds:bounds];
[CATransaction commit];
}

//-(void)setCenter:(CGPoint)center


- (void)setCenter:(CGPoint)center
{
[CATransaction begin];
[CATransaction setDisableActions:self.shouldDisableAnimations];
[super setCenter:center];
[CATransaction commit];
}

现在如果 shouldDisableAnimations 为真,collectionView 的自动动画将不会应用到我们的标题。

但是,禁用标题的动画可能会导致其他故障(例如,当您向下滚动很多,然后删除所有单元格时。标题将立即跳到顶部,并且 collectionView 将滚动到顶部并带有动画,从而导致故障!)

为了处理这个问题,我们需要在调用 prepareForCollectionViewUpdates 的正确时间为 header 设置 shouldDisableAnimations。不幸的是,我们不能通过标题的属性来做到这一点,因为属性是在动画完成后应用到标题的。所以我们需要直接从 prepareForCollectionViewUpdates 方法中直接访问 header 的实例。 (有几种方法可以做到这一点。我通过在自身的类属性上保留标题的弱引用来做到这一点)

-(void)prepareForCollectionViewUpdates:(NSArray<UICollectionViewUpdateItem *> *)updateItems
{
// Keep track of insert and delete index paths
[super prepareForCollectionViewUpdates:updateItems];

[self.indexPaths2Delete removeAllObjects];
[self.indexPaths2Insert removeAllObjects];

for (UICollectionViewUpdateItem *update in updateItems)
{
if (update.updateAction == UICollectionUpdateActionDelete)
{
[self.indexPaths2Delete addObject:update.indexPathBeforeUpdate];
}
else if (update.updateAction == UICollectionUpdateActionInsert)
{
[self.indexPaths2Insert addObject:update.indexPathAfterUpdate];
}
}

if (self.indexPaths2Insert.count > 0 || self.indexPaths2Delete.count > 0)
{
HomeHeaderView.liveInstance.shouldDisableAnimations = false; //since it may cause scrolling, we should enable the animations
}
else
HomeHeaderView.liveInstance.shouldDisableAnimations = true; //there's nothing added or deleted, so keep the header sticked.
}

关于ios - UICollectionView 粘性标题在集合过度滚动时插入部分后消失一段时间(弹跳效果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54867434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com