Градиент BG в UICollectionViewCell

Я создал UICollectionView с ячейкой, как кредитные карты, и хочу добавить градиентный слой в качестве фона для этих карт. Сначала я добавил фоновый вид для тени (shadowView), а затем добавил второй вид для градиентного слоя (bgView) и добавил CAGradientLayer в качестве подслоя bgView. Но я не получил никакого представления градиент. Это мой код:

class CardCell: BaseCell {

    private var shadowView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = UIColor.white
        view.layer.shadowColor = UIColor.shadowColor.cgColor
        view.layer.shadowOffset = CGSize(width: 0, height: 1.0)
        view.layer.shadowOpacity = 0.1
        view.layer.shadowRadius = 15.0
        return view
    }()

    private var bgView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.layer.cornerRadius = 5
        view.layer.masksToBounds = true
        view.backgroundColor = .clear
        view.layer.addSublayer(createGradientLayer(for: view))
        return view
    }()

    override func setup() {
        super.setup()
        addSubview(shadowView)
        addSubview(bgView)

        // setup constraints
        shadowView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.9).isActive = true
        shadowView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 1).isActive = true
        shadowView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        shadowView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

        bgView.topAnchor.constraint(equalTo: shadowView.topAnchor).isActive = true
        bgView.bottomAnchor.constraint(equalTo: shadowView.bottomAnchor).isActive = true
        bgView.leadingAnchor.constraint(equalTo: shadowView.leadingAnchor).isActive = true
        bgView.trailingAnchor.constraint(equalTo: shadowView.trailingAnchor).isActive = true

    }

    private static func createGradientLayer(for view: UIView) -> CAGradientLayer {
        let color = UIColor(red:0.95, green:0.42, blue:0.64, alpha:1.0)
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = view.bounds
        gradientLayer.colors = [color.cgColor, color.withAlphaComponent(0.7).cgColor]
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 1.1, y: 1.1)
        return gradientLayer
    }

}

Но если я изменю этот код и удалю настройку градиента из bgView init и напишу его после ограничений, все в порядке, НО теневой вид исчезнет:

. . .
bgView.leadingAnchor.constraint(equalTo: shadowView.leadingAnchor).isActive = true
bgView.trailingAnchor.constraint(equalTo: shadowView.trailingAnchor).isActive = true

bgView.layoutIfNeeded()
bgView.layer.addSublayer(CardCell.createGradientLayer(for: bgView))

Градиент BG в UICollectionViewCell

это похоже на то, что вы пытаетесь достичь?

Ahmad F 31.07.2018 08:24

Попробуйте Добавить представления в представление содержимого ячейки contentView.addSubview(shadowView)contentView.addSubview(bgView)

Lal Krishna 31.07.2018 09:42

@LalKrishna ничего не изменилось :(

Jack Daniel 31.07.2018 10:03

можешь добавить скриншот того, чего пытаешься достичь?

Lal Krishna 31.07.2018 10:05

@LalKrishna добавил скриншот. Я хочу добавить тень к этим карточкам на изображении.

Jack Daniel 31.07.2018 12:06

Пожалуйста, проверьте мой обновленный отвечать. @JackDaniel

Lal Krishna 01.08.2018 06:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
1 349
3

Ответы 3

Я думаю, что ваш слой градиента, добавленный к вашему теневому представлению, показывает, что ваше теневое представление исчезает .. Вы всегда должны добавлять слой градиента с индексом 0 слоев.

bgView.layer.insertSublayer(CardCell.createGradientLayer(for: bgView), at: 0)

и в методе создания вашего слоя вам нужно использовать рамку вместо границ.

private static func createGradientLayer(for view: UIView) -> CAGradientLayer {
    let color = UIColor(red:0.95, green:0.42, blue:0.64, alpha:1.0)
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = view.frame
    gradientLayer.colors = [color.cgColor, color.withAlphaComponent(0.7).cgColor]
    gradientLayer.locations = nil
    return gradientLayer
}

проблема остается прежней. Не помогло :(

Jack Daniel 31.07.2018 08:11

Пожалуйста, проверьте обновленный ответ ... используйте рамку вместо границ.

Rakesh Patel 31.07.2018 08:12

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

Rakesh Patel 31.07.2018 08:31

ничего не изменил

Jack Daniel 31.07.2018 08:50

Проблема в том, что когда вы добавляете градиентный вид, bgView не является макетом полностью. Таким образом, граница будет равна нулю.

Решение:

private var gradient: CAGradientLayer?

override func awakeFromNib() {
        super.awakeFromNib()
        self.setup()
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        shadowView.layer.shadowPath = UIBezierPath(rect: shadowView.bounds).cgPath

        if let gradient = gradient {
            gradient.frame = bgView.bounds
        } else {
            gradient = TestCell.createGradientLayer(for: bgView)
            bgView.layer.addSublayer(gradient!)
        }
    }

ВЫХОД:

extension UIView {
func addGradientToViewWithCornerRadiusAndShadow(radius:CGFloat,firstColor:UIColor,secondColor:UIColor,locations:[CGFloat]){
        for layer in (self.layer.sublayers ?? []){
            if let layer1 = layer as? CAGradientLayer{
                layer1.removeFromSuperlayer()
            }
        }
        let gradient = CAGradientLayer()
        var rect = self.bounds
        rect.size.width = ScreenWidth
        gradient.frame = rect
        gradient.colors = [firstColor.cgColor, secondColor.cgColor]
        gradient.locations = locations as [NSNumber]
        gradient.startPoint = CGPoint.init(x: 0, y: 0)
        gradient.endPoint = CGPoint.init(x: 0, y: 1)
        gradient.cornerRadius = radius
        gradient.shadowRadius = 2
        gradient.shadowColor = UIColor.lightGray.cgColor
        gradient.shadowOffset = CGSize.init(width: 0.5, height: 0.5)
        gradient.shadowOpacity = 0.5
        self.layer.insertSublayer(gradient, at: 0)
    }
}

попробуйте использовать это расширение UIView. Сообщите мне, поможет ли это.

Другие вопросы по теме