Если ваша идея - использовать одно изображение, вам нужно использовать его как глиф. Это означает, что вы должны стереть данные о цвете и каждый раз подкрашивать их нужным цветом. Теперь, если у вас есть прозрачная заливка и цветная рамка, которая не будет работать, потому что вы не можете заполнить UIImage цветами, игнорируя исходный цвет границы. У вас есть несколько вариантов здесь.
Опция 1 - использовать два изображения
let deselectedImage = UIImage(named: "heart")
let selectedImage = UIImage(named: "heart-filled")
Опция 2 - использовать одно изображение и играть в режиме рендеринга
let deselectedImage = UIImage(named: "heart")?.withRenderingMode(.alwaysOriginal)
let selectedImage = UIImage(named: "heart")?.withRenderingMode(.alwaysTemplate)
selectedImage.tintColor = .red
Опция 3 - Использование цвета границы слоя и режим рендеринга
То же, что и в варианте 2, но вам понадобится изображение белого сердца, но в режиме отмены выбора вы также установитецвет границы для него.