如果在 collection 的两侧缩放,UICollectionViewCell 不会绘制阴影

UICollectionViewCell doesn't draw shadow when zoomed if at the sides of the collection

我在处理我的第一个 tvOS 应用程序时遇到了一个有趣的问题(实际上是我多年来的第一个 iOS 应用程序)。

我想要实现的是在 UICollectionView 的单元格被选中时自定义缩放和阴影。

奇怪的是我能够看到单元格的缩放效果和阴影,但是当它们位于 collection 的两侧时,阴影不会被渲染。

让我用几张图片向您展示问题。

这是我想要实现的正确结果,它适用于 "internal" 个单元格:更大的阴影 + 缩放(缩放)。

这是我为 "external" 单元格得到的错误结果:缩放(缩放)没问题,但阴影没有更新。这对 collection.

右侧的另一个 "external" 单元格也有效

更有趣的是,如果我不缩放单元格,那么阴影会正确更新:

这是我自定义的代码UICollectionViewCell:

import UIKit

class MyCloudCollectionViewCell: UICollectionViewCell {

    var selectTrans: UIFocusAnimationCoordinator?
    var scale : CGFloat = 0.0

    override func layoutSubviews() {
        super.layoutSubviews()

        self.clipsToBounds = false
        self.layer.masksToBounds = false
        self.layer.shadowOpacity = 0.20;
        self.layer.shadowRadius = 4.0;
        self.layer.shadowOffset = CGSize(width: 1, height: 6);
        self.scale = 1.0
    }

    override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
        coordinator.addCoordinatedAnimations({
            super.didUpdateFocus(in: context, with: coordinator)

            if self.isFocused {
                self.layer.shadowOpacity = 0.25;
                self.layer.shadowRadius = 4.0;
                self.layer.shadowOffset = CGSize(width: 1, height: 18);
                self.scale = 1.19
                let transform = CGAffineTransform(scaleX: self.scale, y: self.scale)
                self.layer.setAffineTransform(transform)
            } else {
                self.layer.shadowOpacity = 0.20;
                self.layer.shadowRadius = 4.0;
                self.layer.shadowOffset = CGSize(width: 1, height: 6);
                self.scale = 1.0
                let transform = CGAffineTransform(scaleX: self.scale, y: self.scale)
                self.layer.setAffineTransform(transform)
            }
        }, completion: nil)
    }
}

Collection 还有这些设置:

self.collectionView?.clipsToBounds = false
self.collectionView?.layer.masksToBounds = false

问题是基本视图单元不是执行那种操作的正确位置。

尝试使用自定义容器视图而不是基本视图单元格。