trailingSwipeActionsConfigurationProvider вызывает исчезновение теневого эффекта на UICollectionViewListCell

Вопрос или проблема

В данный момент я достиг эффекта тени и закругления углов для UICollectionViewListCell, используя следующий код.

UICollectionViewListCell

class NoteCell: UICollectionViewListCell {
    
    override func awakeFromNib() {
        super.awakeFromNib()

        initShadow()
        initCorner()
    }
    
    private func updateShadowColor() {
        // Определяем цвет тени в зависимости от текущего стиля интерфейса
        let shadowUIColor = UIColor.label
        self.layer.shadowColor = shadowUIColor.cgColor
    }
    
    private func initShadow() {
        // https://www.hackingwithswift.com/example-code/uikit/how-to-add-a-shadow-to-a-uiview
        
        self.layer.shadowOpacity = 0.3
        self.layer.shadowOffset = CGSize(width: 0.5, height: 0.5)
        self.layer.shadowRadius = 2
        self.layer.masksToBounds = false
        
        self.updateShadowColor()
        
        // Удалите следующие две строки, если у вас возникают проблемы с рендерингом тени:
        self.layer.shouldRasterize = true
        self.layer.rasterizationScale = UIScreen.main.scale
    }

    private func initCorner() {
        var backgroundConfig = UIBackgroundConfiguration.listPlainCell()
        backgroundConfig.backgroundColor = .systemBackground
        backgroundConfig.cornerRadius = 16
        self.backgroundConfiguration = backgroundConfig
    }

layout

private func layoutConfig() -> UICollectionViewCompositionalLayout {
    let layout = UICollectionViewCompositionalLayout { section, layoutEnvironment in
        var config = UICollectionLayoutListConfiguration(appearance: .plain)

        config.headerMode = .none
        config.footerMode = .none
        config.showsSeparators = false
        config.headerTopPadding = 0
        
        config.backgroundColor = nil
        
        config.trailingSwipeActionsConfigurationProvider = { [weak self] indexPath in
            guard let self = self else { return nil }

            // Узнаем, на что мы нажимаем.
            var snapshot = dataSource.snapshot()
            let sectionIdentifier = snapshot.sectionIdentifiers[indexPath.section]
            let itemIdentifiers = snapshot.itemIdentifiers(inSection: sectionIdentifier)
            let itemIdentifier: NoteWrapper = itemIdentifiers[indexPath.item]
            
            let deleteHandler: UIContextualAction.Handler = { action, view, completion in
                completion(true)
                
                // TODO:
                //snapshot.reloadItems([itemIdentifier])
            }
            
            let deleteAction = UIContextualAction(style: .normal, title: "Корзина", handler: deleteHandler)
            
            var swipeActionsConfiguration =  UISwipeActionsConfiguration(actions: [
                deleteAction,
            ])
            
            deleteAction.image = UIImage(systemName: "trash")
            deleteAction.backgroundColor = UIColor.systemRed
            
            swipeActionsConfiguration.performsFirstActionWithFullSwipe = false
            
            return swipeActionsConfiguration
        }
        
        // https://developer.apple.com/forums/thread/759987
        let layoutSection = NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)
        layoutSection.interGroupSpacing = 16 // Расстояние между элементами.
        layoutSection.contentInsets = NSDirectionalEdgeInsets(
            top: 16,    // Расстояние между первым элементом и его заголовком.
            leading: 16,
            bottom: 16, // Расстояние между последним элементом и другим заголовком/нижним краем.
            trailing: 16
        )
        
        return layoutSection
    }
    
    return layout
}

Вот такой результат.

введите описание изображения здесь

Однако, когда я выполняю действие свайпа, эффект тени исчезает.

введите описание изображения здесь

У вас есть идеи, как я могу это решить? Спасибо.

Ответ или решение

Чтобы решить проблему с эффектом тени для UICollectionViewListCell, который исчезает при выполнении действий пролистывания, необходимо учитывать, что UICollectionViewListCell может изменять свои свойства отображения при взаимодействии. Когда вы используете конфигурацию действий пролистывания (trailingSwipeActionsConfigurationProvider), возможно, происходит обновление или переиспользование ячейки, в результате чего настройки тени и углов могут сбрасываться.

Для исправления данной проблемы, вам нужно будет переопределить метод prepareForReuse() в вашей кастомной ячейке NoteCell, чтобы заново устанавливать тень и углы. Таким образом, каждый раз, когда ячейка переиспользуется, эффект тени будет восстановлен.

Вот как это можно сделать:

class NoteCell: UICollectionViewListCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        initShadow()
        initCorner()
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        // Обновляем тень и углы при повторном использовании ячейки
        updateShadowColor()
        initShadow()
        initCorner()
    }

    private func updateShadowColor() {
        let shadowUIColor = UIColor.label
        self.layer.shadowColor = shadowUIColor.cgColor
    }

    private func initShadow() {
        self.layer.shadowOpacity = 0.3
        self.layer.shadowOffset = CGSize(width: 0.5, height: 0.5)
        self.layer.shadowRadius = 2
        self.layer.masksToBounds = false

        self.updateShadowColor()

        self.layer.shouldRasterize = true
        self.layer.rasterizationScale = UIScreen.main.scale
    }

    private func initCorner() {
        var backgroundConfig = UIBackgroundConfiguration.listPlainCell()
        backgroundConfig.backgroundColor = .systemBackground
        backgroundConfig.cornerRadius = 16
        self.backgroundConfiguration = backgroundConfig
    }
}

Убедитесь, что вы вызвали initShadow() и initCorner() в методе prepareForReuse(), чтобы гарантировать, что все визуальные настройки будут восстановлены при каждом использовании ячейки. Это должно решить вашу проблему с исчезновением тени при выполнении действий пролистывания.

Также полезно проверить настройки компоновки ячейки и убедиться, что никакие другие параметры не вмешиваются в визуальные эффекты, которые вы пытаетесь достичь. Если проблема сохраняется, возможно, стоит исследовать дополнительные конфигурации или обновления представления ячейки, чтобы понять, как они могут влиять на отображение.

Оцените материал
Добавить комментарий

Капча загружается...