Для тех, кто может найти это полезным, изменения, необходимые для его работы ..
Используя визуальный эффект, Бен предложил мне, чтобы я смог заставить это работать. Я никогда не использовал визуальные эффекты, поэтому точно не знаю, почему это работает. Снова, вероятно, есть некоторые улучшения, которые мне нужны
В пользовательском классе ячеек таблицы я добавил UIVisualEffectView
. В его представлении содержимого я добавил элемент, фон которого я хотел изменить.
Добавьте любые подпредставления в свойство contentView представления визуального эффекта. Не добавляйте подпредставления непосредственно в само представление визуальных эффектов
lazy var visualEffectView: UIVisualEffectView = {
let v = UIVisualEffectView()
v.translatesAutoresizingMaskIntoConstraints = false
v.contentView.addSubview(taskInfoCollectionView)
NSLayoutConstraint.activate([
taskInfoCollectionView.topAnchor.constraint(equalTo: v.topAnchor),
taskInfoCollectionView.leadingAnchor.constraint(equalTo: v.leadingAnchor),
taskInfoCollectionView.trailingAnchor.constraint(equalTo: v.trailingAnchor),
taskInfoCollectionView.bottomAnchor.constraint(equalTo: v.bottomAnchor),
])
return v
}()
Вернувшись в контроллер, я использую эту функцию, чтобы добавить градиент к представлению визуальных эффектов, которое принимает индекс и ячейку
func addGradient(_ i: Int, _ cell: GroupTableCell) {
guard let colorOne = Colors(rawValue: i)?.classicColor,
let colorTwo = Colors(rawValue: i)?.alternativeColor else {return}
cell.visualEffectView.contentView.setGradientBackground(colorOne: colorOne,
colorTwo: colorTwo,
name: cellLayerName)
}
Мне все еще нужно было добавить функцию к viewWillLayoutSubviews
. Это для настройки ячеек, которые cellForRowAt
не делает. Свойство setGradients
изначально имеет значение true, но затем сразу устанавливается на false, поэтому оно не вызывается непрерывно, как раньше.
var setGradients = true
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if setGradients {
configTableCells()
setGradients = false
}
}
func configTableCells() {
guard let cells = self.tableView.visibleCells as? [GroupTableCell] else {return}
for (i, cell) in cells.enumerated() {
if shouldAddSubLayer(cell) {
addGradient(i, cell)
}
}
}
Затем, наконец, в cellForRowAt
это, кажется, заботится обо всем остальном и обо всемКажется, работает без задержек.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: GROUP_CELL_ID, for: indexPath) as! GroupTableCell
cell.groupNameLabel.text = "Group Name"
cell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
addGradient(indexPath.row, cell)
return cell
}
Я пробовал это с использованием UIView
, а не UIVisualEffectView
. но градиенты снова перекрывают содержимое ячейки. поэтому UIVisualEffectView
требуется