ios – 具有重叠单元格和自定义插入和删除动画的UICollectionView

ios – 具有重叠单元格和自定义插入和删除动画的UICollectionView,第1张

概述我正在开发一个自定义的UICollectionView布局,其中单元格重叠在一起.除此之外,我正在为添加和删除项目实现自定义动画. 一切正常,除了在插入/删除项目期间属性的zIndex属性似乎被忽略. 适当的细胞: 插入一些细胞后: 这是我自定义插入/删除动画的实现.我的猜测是问题出在这些方法的某个地方. override func initialLayoutAttributesForAppear 我正在开发一个自定义的UICollectionVIEw布局,其中单元格重叠在一起.除此之外,我正在为添加和删除项目实现自定义动画.

一切正常,除了在插入/删除项目期间属性的zIndex属性似乎被忽略.

适当的细胞:

插入一些细胞后:

这是我自定义插入/删除动画的实现.我的猜测是问题出在这些方法的某个地方.

overrIDe func initialLayoutAttributesForAppearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionVIEwLayoutAttributes? {    let attributes = layoutAttributesForItemAtIndexPath(itemIndexPath)    for updateItem in updateItems {        switch updateItem.updateAction {        case .Insert:            if updateItem.indexPathAfterUpdate == itemIndexPath {                let translation = collectionVIEw!.bounds.height                attributes?.transform = CGAffinetransformMakeTranslation(0,translation)                break            }        default:            break        }    }    return attributes}overrIDe func finalLayoutAttributesFordisappearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionVIEwLayoutAttributes? {    for updateItem in updateItems {        switch updateItem.updateAction {        case .Delete:            if updateItem.indexPathBeforeUpdate == itemIndexPath {                let attributes = layoutAttributesForItemAtIndexPath(itemIndexPath)                let translation = collectionVIEw!.bounds.height                attributes?.transform = CGAffinetransformMakeTranslation(0,translation)                return attributes            }        case .Move:            if updateItem.indexPathBeforeUpdate == itemIndexPath {                return layoutAttributesForItemAtIndexPath(updateItem.indexPathAfterUpdate!)            }        default:            break        }    }    let finalindex = finalindexForIndexPath(itemIndexPath)    let shiftedindexPath = NSIndexPath(forItem: finalindex,inSection: itemIndexPath.section)    return layoutAttributesForItemAtIndexPath(shiftedindexPath)}private func finalindexForIndexPath(indexPath: NSIndexPath) -> Int {    var newIndex = indexPath.item    for updateItem in updateItems {        switch updateItem.updateAction {        case .Insert:            if updateItem.indexPathAfterUpdate!.item <= newIndex {                newIndex += 1            }        case .Delete:            if updateItem.indexPathBeforeUpdate!.item < newIndex {                newIndex -= 1            }        case .Move:            if updateItem.indexPathBeforeUpdate!.item < newIndex {                newIndex -= 1            }            if updateItem.indexPathAfterUpdate!.item <= newIndex {                newIndex += 1            }        default:            break        }    }    return newIndex}

我试过的事情:

>将initialLayoutAttributes …方法中的zIndex设置为最终的值.
>在动画之后手动对集合视图进行重新排序(非常Hacky,我想避免这种情况,因为它有时会导致一些奇怪的行为).
>调用super.initialLayoutAttributes …等并修改从中返回的属性.问题在于,当插入新单元时,它不处理其他单元移位;相反,细胞淡入淡出.

该项目的一个小型复制品可以在my GitHub找到.随意克隆它并玩它.

解决方法 我怀疑,似乎集合视图在动画期间没有正确应用布局属性.幸运的是,UICollectionVIEwCell提供了一种实现自定义布局属性的方法:

overrIDe func applyLayoutAttributes(layoutAttributes: UICollectionVIEwLayoutAttributes) {    layer.zposition = CGfloat(layoutAttributes.zIndex)}

添加上面的代码会导致插入的单元格出现在正确的zIndex上.

我将记录雷达并通过链接发表评论.

总结

以上是内存溢出为你收集整理的ios – 具有重叠单元格和自定义插入和删除动画的UICollectionView全部内容,希望文章能够帮你解决ios – 具有重叠单元格和自定义插入和删除动画的UICollectionView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1049623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存