-1

我想在具有组合布局的新集合视图的上下文中向集合视图单元格的背景添加渐变。这是一个如何从 Apple 的示例代码实现现代集合视图中的第 180 行中配置单元格背景的示例EmojiExplorerViewController

func configuredGridCell() -> UICollectionView.CellRegistration<UICollectionViewCell, Emoji> {
    return UICollectionView.CellRegistration<UICollectionViewCell, Emoji> { (cell, indexPath, emoji) in
        var content = UIListContentConfiguration.cell()
        content.text = emoji.text
        content.textProperties.font = .boldSystemFont(ofSize: 38)
        content.textProperties.alignment = .center
        content.directionalLayoutMargins = .zero
        cell.contentConfiguration = content
        var background = UIBackgroundConfiguration.listPlainCell()
        background.cornerRadius = 8
        background.strokeColor = .systemGray3
        background.strokeWidth = 1.0 / cell.traitCollection.displayScale
        cell.backgroundConfiguration = background
    }
}

由于 newUIBackgroundConfiguration是一个结构而不是层支持的UIView子类,我不能只添加一个CAGradientLayer实例作为子层。

向单元格背景配置添加渐变的好方法是什么?

4

1 回答 1

2

由于新的 UIBackgroundConfiguration 是一个结构而不是一个层支持的 UIView 子类,我不能只添加一个 CAGradientLayer 实例作为子层。

是的你可以。UIBackgroundConfiguration 是一个结构的事实是无关紧要的。它有customView一个视图属性,将用作单元格中的背景视图(在内容视图后面)。因此,将该视图设置为某些东西(nil默认情况下),一切就绪。

这是一个例子。这是一个用于测试目的的玩具表视图,但测试完全是关于配置对象的,因此它很容易适应演示该技术。只要您使用的是具有 UIBackgroundConfiguration 属性的东西,您使用的是表格视图、集合视图还是两者都没有关系。如您所见,我制作了从黑色到红色的垂直渐变作为单元格的背景。

在此处输入图像描述

这是相关的代码。首先,我定义了一个梯度载体视图类型:

class MyGradientView : UIView {
    override static var layerClass: AnyClass { CAGradientLayer.self }
}

然后,我在配置单元格时将该视图用作背景视图:

var back = UIBackgroundConfiguration.listPlainCell()
let v = MyGradientView()
(v.layer as! CAGradientLayer).colors = 
    [UIColor.black.cgColor, UIColor.red.cgColor]
back.customView = v
cell.backgroundConfiguration = back

您想要实现的其他任何目标都只是上述内容的变体。例如,您可以使用图像视图或纯色背景视图并将它们与渐变视图相结合。关键是,它customView 背景视图,你设置的任何视图都将显示在单元格的背景中。

我还应该指出,还有另一种方法可以做到这一点,即使用单元子类并实现updateConfigurationUsingState:. 这种方法的优点是一旦你给了后台配置 a customView,你可以在每次调用方法时修改它。customView您可以使用此技术来响应选择,例如,正如我在此处的其他答案中所展示的那样(例如https://stackoverflow.com/a/63064099/341994)。

于 2020-10-16T12:40:17.927 回答