Ios 如何在具有合成布局的新集合视图中将CAGradientLayer添加到UIBackgroundConfiguration?

Ios 如何在具有合成布局的新集合视图中将CAGradientLayer添加到UIBackgroundConfiguration?,ios,uikit,core-animation,calayer,uicollectionviewcompositionallayout,Ios,Uikit,Core Animation,Calayer,Uicollectionviewcompositionallayout,我想在具有合成布局的新集合视图的上下文中为集合视图单元格的背景添加渐变。下面是一个示例,说明如何根据EmojiExplorerViewController第180行中苹果的示例代码配置单元格的背景: func configuredGridCell()->UICollectionView.CellRegistration{ 在中返回UICollectionView.CellRegistration{(单元格、indexPath、表情符号) var content=UIListContentConf

我想在具有合成布局的新集合视图的上下文中为集合视图单元格的背景添加渐变。下面是一个示例,说明如何根据EmojiExplorerViewController第180行中苹果的示例代码配置单元格的背景:

func configuredGridCell()->UICollectionView.CellRegistration{
在中返回UICollectionView.CellRegistration{(单元格、indexPath、表情符号)
var content=UIListContentConfiguration.cell()
content.text=emoji.text
content.textProperties.font=.boldSystemFont(of大小:38)
content.textProperties.alignment=.center
content.directionalLayoutMargins=.0
cell.contentConfiguration=content
var background=UIBackgroundConfiguration.listplanecell()
背景角半径=8
background.strokeColor=.systemGray3
background.strokeWidth=1.0/cell.traitCollection.displayScale
cell.backgroundConfiguration=背景
}
}
由于新的
UIBackgroundConfiguration
是一个结构,而不是一个层备份的
UIView
子类,因此我不能仅仅将
cagradintlayer
实例添加为子层

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

由于新的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
是背景视图,您将其设置为的任何视图都将显示在单元格的背景中


我还应该指出,还有另一种方法可以做到这一点,即使用cell子类并使用state:实现
updateconfiguration。这种方法的优点是,一旦为后台配置指定了一个
customView
,每次调用该方法时,只需修改该
customView
。您可以使用此技术来响应选择,例如,正如我在这里的其他答案(如)中所演示的那样。

“由于新的UIBackgroundConfiguration是一个结构而不是一个以层为基础的UIView子类,因此我不能仅将CAGradientLayer实例添加为子层。”实际上UIBackgroundConfiguration有一个背景视图,视图可以是一个渐变层载体,所以很难看出困难是什么。我相信我尝试过将
customView
设置为渐变层载体,但没有成功,但我还设置了一个预设列表单元格配置,这可能是问题所在。不知何故,我没有注意到您链接的文档中有一个空视图配置,所以当我一小时后回到计算机时,我将使用空背景视图和设置自定义视图进行测试。@matt我刚刚测试并验证了
backgroundConfiguration.customView?.layer.insertSublayer(gradientLayer,at:0)
不显示渐变,只显示预设的背景配置,在本例中为
UIBackgroundConfiguration.listplancell()
。将配置更改为
ui backgroundconfiguration.clear()
会显示一个清晰的视图。嗯,您的测试是错误的。举一个实际的例子。很抱歉误解,谢谢。作为核心动画新手,在背景
customView
上插入一个子层似乎是根据参考文档为背景添加
CALayer
的正确方法()。当你说“梯度层载体”时,我没有想到这是一个特定的模式(
覆盖静态var layerClass:AnyClass{CAGradientLayer.self}
),据我所知,苹果没有包括这一点的概念解释。鉴于否决票,我如何改进这个问题?