UICollectionViewCell 与自定义 UICollectionViewLayout 仅在一个子视图上创建视差动画

Posted

技术标签:

【中文标题】UICollectionViewCell 与自定义 UICollectionViewLayout 仅在一个子视图上创建视差动画【英文标题】:UICollectionViewCell with custom UICollectionViewLayout to create Parallax Animation On Just one subview 【发布时间】:2019-03-05 16:09:33 【问题描述】:

受本教程启发[自定义 UICollectionViewLayout 教程与视差][1]

[1]:https://www.raywenderlich.com/527-custom-uicollectionviewlayout-tutorial-with-parallax我创建了自己版本的视差集合视图。

我正在使用以下逻辑创建视差动画并在页眉和页脚上产生反弹效果:

 private func updateSupplementaryViews(_ type: Element, attributes: CustomLayoutAttributes, collectionView: UICollectionView, indexPath: IndexPath) 
    if type == .header,
        settings.isHeaderStretchy 

        var delta: CGFloat = 0.0
        let updatedHeight = min(
            collectionView.frame.height + headerSize.height,
            max(headerSize.height , headerSize.height - contentOffset.y))

        let scaleFactor = updatedHeight / headerSize.height

        if contentOffset.y <= 0
            delta = (updatedHeight - headerSize.height) / 2

        else
            delta = (headerSize.height - updatedHeight - abs(contentOffset.y))
        

        let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)
        let translation = CGAffineTransform(translationX: 0, y: min(contentOffset.y, headerSize.height) + delta)
        attributes.transform = scale.concatenating(translation)

    else if type == .footer,
        settings.isFooterStretchy 

        var updatedHeight: CGFloat = 0.0
        if collectionView.contentSize.height - contentOffset.y < UIScreen.main.bounds.height 
            updatedHeight = min(
                collectionView.frame.height + footerSize.height,
                max(footerSize.height, abs(((collectionView.contentSize.height - (footerSize.width + deviationDeviceSize)) - UIScreen.main.bounds.height) - contentOffset.y)))
        else
            updatedHeight = min(
                collectionView.frame.height + footerSize.height,
                max(headerSize.height, headerSize.height - contentOffset.y))
        

        let scaleFactor = updatedHeight / footerSize.height
        let delta = ((updatedHeight - footerSize.height) / 2) - footerSize.height
        let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)
        let translation = CGAffineTransform(translationX: 0, y: min(contentOffset.y, footerSize.height) + delta )
        attributes.transform = scale.concatenating(translation)
    

除了我所有的单元格子视图都使用这个动画缩放而且我只想缩放我的背景图像这一恼人的事实之外,一切都很好。这看起来很简单,但不幸的是我无法找到一种方法来控制转换正在操纵哪些子视图。

【问题讨论】:

可以在某处下载项目吗? 您好,给您更好的帮助理想的是我下载了这个项目。但是有一个建议:(我不知道你的级别,所以如果我对你说一些基本的事情,我很抱歉。)当你在一个视图中做某事时,它下面/内部的所有子视图都会受到影响。例如,如果您更改视图的 alpha,子视图也会受到影响。所以从你所说的来看,我怀疑你正在做一些影响子视图的事情,所以它不会发生,将你的背景图像(或影响你的子视图)分层放置在与子视图相同的级别。 只需使用custom attribute 并覆盖applyAttribute 方法 【参考方案1】:
    您为 Element.footer 设置了哪些 customAttributes ? 您设置的footerSize 是多少?

您在项目中包含了一些关于页脚的实现,这些实现对我们来说是不可见的?介意分享整个文件吗?

【讨论】:

以上是关于UICollectionViewCell 与自定义 UICollectionViewLayout 仅在一个子视图上创建视差动画的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell 与自定义 UICollectionViewLayout 仅在一个子视图上创建视差动画

将 FirebaseUI-IOS 与自定义 UICollectionViewCell 一起使用时出错

NSMutableArray 与自定义对象?

Django Ajax与自定义分页器

didSelectRowAtIndexPath 与自定义单元格

JSF 自定义复合组件与自定义经典组件有啥区别