TL; DR: есть 2 представления (верхнее и нижнее), для которых требуется CAGradientLayer. Неожиданным поведением является то, что только вид сверху отображает градиент. Внизу не отображается градиент.
В нашем приложении у меня есть представление с UICollectionView, как показано на изображении:
Для каждого UICollectionViewCell я создал собственный класс для деталей макета. В UICollectionViewCell у меня есть «topBackground» и «bottomBackground», которые представляют собой представления, которые будут содержать метки с информацией для каждой ячейки:
@IBOutlet weak var topBackground: UIView!
@IBOutlet weak var bottomBackground: UIView!
Виды сверху и снизу, метки отображались правильно, и ограничения работали.
Мы решили добавить эффект градиента в вид сверху и снизу (см. Подробности на изображении, верхний градиент отмечен красным, а нижние детали отмечены желтым) .
Для кода мы использовали следующее:
override func layoutSubviews() {
if !didLayout{
// Top View
let gradientLayer: CAGradientLayer = CAGradientLayer()
gradientLayer.frame = topBackground.frame
gradientLayer.colors =
[UIColor.black.withAlphaComponent(0.5).cgColor, UIColor.black.withAlphaComponent(0).cgColor]
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.9)
topBackground.layer.insertSublayer(gradientLayer, at: 0)
topBackground.backgroundColor = .clear
topBackground.alpha = 0.5
// Bottom View
let gradientLayerBottom: CAGradientLayer = CAGradientLayer()
gradientLayerBottom.frame = bottomBackground.frame
gradientLayerBottom.colors =
[UIColor.black.withAlphaComponent(0.5).cgColor, UIColor.black.withAlphaComponent(0).cgColor]
gradientLayerBottom.startPoint = CGPoint(x: 0.5, y: 0.9)
gradientLayerBottom.endPoint = CGPoint(x: 0.5, y: 0)
bottomBackground.layer.insertSublayer(gradientLayerBottom, at: 0)
bottomBackground.backgroundColor = .clear
bottomBackground.alpha = 0.5
didLayout = true
} else {
print("already performed layout")
}
}
Переменная didLayout
предназначена для предотвращения перекрытия нескольких градиентов при прокрутке представления коллекции.
Результаты:
- Вид сверху отображает градиент (ожидаемый).
- Нижний вид не отображает градиент (неожиданно).
Мы знаем, что существует нижний вид с рабочими ограничениями, потому что, если мы изменим цвет на отличный от .clear
, он отобразит другой цвет. Просто gradientLayerBottom
не отображается.
Есть идеи, как заставить gradientLayerBottom
отображаться?
0
? - person Lu_   schedule 31.05.2019layer.sublayers
. Также пробовалaddSublayer
вместоinsertSublayer(at:)
, но результаты те же. - person Victor Sanchez   schedule 31.05.2019