Как добавить тень к кастомной cell в UICollectionView, если masksToBounds ломает UI?

Чтобы добавить тень к кастомной ячейке (cell) в UICollectionView, без влияния на интерфейс пользователя, можно использовать следующий подход.

1. Создайте подкласс UICollectionViewCell для вашей кастомной ячейки:

class CustomCell: UICollectionViewCell {
    override func layoutSubviews() {
        super.layoutSubviews()
        
        // Добавляем корневой слой (layer)
        self.layer.cornerRadius = 10 // округление углов
        self.layer.shadowColor = UIColor.black.cgColor // цвет тени
        self.layer.shadowOffset = CGSize(width: 0, height: 2) // смещение тени
        self.layer.shadowOpacity = 0.5 // прозрачность тени
        self.layer.shadowRadius = 4 // радиус размытия тени
        self.layer.masksToBounds = false // разрешаем применять тень за пределами границ ячейки
    }
}

2. В вашем классе UICollectionViewDataSource используйте подкласс CustomCell для отображения вашей кастомной ячейки:

class ViewController: UIViewController, UICollectionViewDataSource {
    @IBOutlet weak var collectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Установите источник данных и делегат для вашей UICollectionView
        collectionView.dataSource = self
        collectionView.delegate = self
        
        // Зарегистрируйте кастомный класс ячейки для использования в вашей UICollectionView
        collectionView.register(CustomCell.self, forCellWithReuseIdentifier: "CustomCell")
    }
    
    // Отображение данных в ячейках
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
        // Настройте вашу кастомную ячейку здесь
        return cell
    }
    
    // Другие функции делегата UICollectionViewDataSource
}

Теперь, при отображении вашей кастомной ячейки в UICollectionView, вы увидите, что она имеет тень, но при этом не повреждает интерфейс пользователя за счет использования свойства masksToBounds = false. Убедитесь, что вы настроили другие аспекты вашей кастомной ячейки в соответствии с вашими потребностями.