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

#swift #uiview #uikit #layer #shadow

Вопрос:

Я программно добавляю UIView и устанавливаю его контрейнты с помощью NSLayoutConstraint, как показано ниже, но тень не добавляется.

Для тени я использую SwifterSwift .addShadow()

Результат, который я получаю

UIView:

     lazy var alertViewNew: UIView = {
        let view = UIView()
        view.layer.zPosition = 1
        view.cornerRadius = 20
        view.addShadow(ofColor: .lightGray, radius: 3, offset: .zero, opacity: 0.3)
        view.translatesAutoresizingMaskIntoConstraints = false
        
        return alertView
    }()
 

Добавление констеблей

 func setUpAlertView() {
                
        [alertViewNew].forEach {
            (view.addSubview($0))
        }

        NSLayoutConstraint.activate([
        
            alertViewNew.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            alertViewNew.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            alertViewNew.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
            alertViewNew.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
            
            titleLabel.leadingAnchor.constraint(equalTo: alertViewNew.leadingAnchor, constant: 20),
            titleLabel.trailingAnchor.constraint(equalTo: alertViewNew.trailingAnchor, constant: -20),
            titleLabel.topAnchor.constraint(equalTo: alertViewNew.topAnchor, constant: 20),
            
            descriptionLabel.leadingAnchor.constraint(equalTo: alertViewNew.leadingAnchor, constant: 20),
            descriptionLabel.trailingAnchor.constraint(equalTo: alertViewNew.trailingAnchor, constant: -20),
            descriptionLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 20),
            
            updateButton.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 5),
            updateButton.trailingAnchor.constraint(equalTo: alertViewNew.trailingAnchor, constant: -20),
            updateButton.widthAnchor.constraint(equalToConstant: 65),
            updateButton.bottomAnchor.constraint(equalTo: alertViewNew.bottomAnchor, constant: -20),
        ])
    }
 

Добавьте тень от более быстрого быстрого

     func addShadow(ofColor color: UIColor = UIColor(red: 0.07, green: 0.47, blue: 0.57, alpha: 1.0), radius: CGFloat = 3, offset: CGSize = .zero, opacity: Float = 0.5) {
        layer.shadowColor = color.cgColor
        layer.shadowOffset = offset
        layer.shadowRadius = radius
        layer.shadowOpacity = opacity
        layer.masksToBounds = false
    }

 

Вещи, которые я пытался решить эту проблему

Установка маски в значение true

значение параметра непрозрачно для значения true

и некоторые другие испытания, найденные в stackoverflow

Ничего из этого не сработало

Комментарии:

1. layer.masksToBounds измените эту строку на true

2. я сделал это, и все равно проблема не была решена

Ответ №1:

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

Например, я предполагаю, что вы func addShadow находитесь в таком UIView расширении, как это:

 extension UIView {
    func addShadow(ofColor color: UIColor = UIColor(red: 0.07, green: 0.47, blue: 0.57, alpha: 1.0), radius: CGFloat = 3, offset: CGSize = .zero, opacity: Float = 0.5) {
        layer.shadowColor = color.cgColor
        layer.shadowOffset = offset
        layer.shadowRadius = radius
        layer.shadowOpacity = opacity
        
        // no need for this
        //layer.masksToBounds = false
    }
}
 

Далее, ваш lazy var alertViewNew :

 lazy var alertViewNew: UIView = {
    let view = UIView()
    
    // no logical reason for this
    //view.layer.zPosition = 1
    
    // .cornerRadius is not a property of `UIView`
    //view.cornerRadius = 20
    
    // assuming this is in a UIView extension
    view.addShadow(ofColor: .lightGray, radius: 3, offset: .zero, opacity: 0.3)
    
    view.translatesAutoresizingMaskIntoConstraints = false

    // no such thing as alertView
    //return alertView
    
    return view
}()
 

Однако… если мы предположим, что у вас есть код, который действительно работает (где-то определены и созданы метки, правильно добавлены подвиды и т. Д.), Наиболее вероятная причина, по которой вы не видите тень, заключается в том, что у вас alertViewNew , вероятно, четкий фон. Если это ясно, то там нет ничего, что могло бы «отбрасывать тень».

Попробуйте настроить alertViewNew.backgroundColor = .white и посмотрите, устранит ли это проблему.

Или попробуйте этот рабочий пример:

 class CustomAlertTestVC: UIViewController {
    
    lazy var alertViewNew: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white
        
        view.addSubview(alertViewNew)
        setUpAlertView()

    }
    
    func setUpAlertView() {

        let titleLabel = UILabel()
        let descriptionLabel = UILabel()
        let updateButton = UIButton()

        titleLabel.font = .boldSystemFont(ofSize: 16.0)
        titleLabel.text = "New Version Available"
        
        descriptionLabel.font = .systemFont(ofSize: 16.0)
        descriptionLabel.numberOfLines = 0
        descriptionLabel.text = "Please, Update application to the new version to continue."
        
        updateButton.setTitle("UPDATE", for: [])
        updateButton.setTitleColor(.systemBlue, for: [])

        [titleLabel, descriptionLabel, updateButton].forEach {
            $0.translatesAutoresizingMaskIntoConstraints = false
            alertViewNew.addSubview($0)
        }
        
        NSLayoutConstraint.activate([
            
            alertViewNew.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            // no need for centerX since we're adding leading and trailing constraints
            //alertViewNew.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            alertViewNew.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
            alertViewNew.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
            
            titleLabel.leadingAnchor.constraint(equalTo: alertViewNew.leadingAnchor, constant: 20),
            titleLabel.trailingAnchor.constraint(equalTo: alertViewNew.trailingAnchor, constant: -20),
            titleLabel.topAnchor.constraint(equalTo: alertViewNew.topAnchor, constant: 20),
            
            descriptionLabel.leadingAnchor.constraint(equalTo: alertViewNew.leadingAnchor, constant: 20),
            descriptionLabel.trailingAnchor.constraint(equalTo: alertViewNew.trailingAnchor, constant: -20),
            descriptionLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 20),
            
            updateButton.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 5),
            updateButton.trailingAnchor.constraint(equalTo: alertViewNew.trailingAnchor, constant: -20),
            // really no need for width constraint
            //updateButton.widthAnchor.constraint(equalToConstant: 65),
            updateButton.bottomAnchor.constraint(equalTo: alertViewNew.bottomAnchor, constant: -20),
            
        ])
        
        alertViewNew.layer.shadowColor = UIColor.lightGray.cgColor
        alertViewNew.layer.shadowOffset = .zero
        alertViewNew.layer.shadowRadius = 3.0
        alertViewNew.layer.shadowOpacity = 0.3
        alertViewNew.layer.cornerRadius = 20.0
        
        // to get the view's layer to "cast a shadow"
        
        // either set the view's backgroundColor
        alertViewNew.backgroundColor = .white
        
        // or, set the layer's backgroundColor
        //alertViewNew.layer.backgroundColor = UIColor.white.cgColor

    }

}
 

Выход:

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

Комментарии:

1. Спасибо вам за это, и да, я пропустил, чтобы исправить часть своего кода после его изменения в xcode вот почему, например, возвращайте AlertView, где нет объявленного представления с именем 🙂