81 votes

ajouter Shadow sur UIView en utilisant swift 3

avant swift 3, j'ajoutais une ombre à mon UIView comme ceci:

 //toolbar is an UIToolbar (UIView)
toolbar.layer.masksToBounds = false
toolbar.layer.shadowOffset = CGSize(width: -1, height: 1)
toolbar.layer.shadowRadius = 1
toolbar.layer.shadowOpacity = 0.5
 

mais le code ci-dessus ne fonctionne pas dans swift 3, au lieu d'ombre, la couleur de ma vue entière est tournée en gris laid

Quelqu'un sait comment ajouter de l'ombre dans swift 3?

223voto

aashish tamsya Points 2600

EXTRAIT DE CODE:

extension UIView {

  // OUTPUT 1
  func dropShadow(scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = CGSize(width: -1, height: 1)
    layer.shadowRadius = 1

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
  }

  // OUTPUT 2
  func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = color.cgColor
    layer.shadowOpacity = opacity
    layer.shadowOffset = offSet
    layer.shadowRadius = radius

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
  }
}

REMARQUE: Si vous ne passez pas tout paramètre de la fonction, puis l'échelle argument sera le cas par défaut. Vous pouvez définir une valeur par défaut pour un paramètre dans une fonction en lui attribuant une valeur pour le paramètre après que le paramètre de type. Si une valeur par défaut est défini, vous pouvez omettre ce paramètre lors de l'appel de la fonction.

SORTIE 1:

shadowView.dropShadow()

enter image description here

SORTIE 2:

shadowView.dropShadow(color: .red, opacity: 1, offSet: CGSize(width: -1, height: 1), radius: 3, scale: true)

enter image description here

layer.shouldRasterize = true va faire de l'ombre à la statique et à cause d'une ombre pour l'état initial de l' UIView. Donc je vous conseille de ne pas utiliser layer.shouldRasterize = true dans la dynamique des mises en page comme la vue à l'intérieur d'un UITableViewCell.

55voto

Vinu David Jose Points 283

Je voudrais ajouter une ligne de plus avec la réponse sélectionnée! Lorsque nous rastérisons la couche, elle doit être définie sur 2.0 pour les affichages de la rétine. Sinon, le texte ou les images de cette vue seront flous. Nous devons donc ajouter rasterizationScale également.

   extension UIView {

    func dropShadow() {

        self.layer.masksToBounds = false
        self.layer.shadowColor = UIColor.black.cgColor
        self.layer.shadowOpacity = 0.5
        self.layer.shadowOffset = CGSize(width: -1, height: 1)
        self.layer.shadowRadius = 1

        self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        self.layer.shouldRasterize = true

        self.layer.rasterizationScale = UIScreen.main.scale

    }
}
 

45voto

Très simple et quelques lignes de code:

 let viewShadow = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
viewShadow.center = self.view.center
viewShadow.backgroundColor = UIColor.yellow
viewShadow.layer.shadowColor = UIColor.red.cgColor
viewShadow.layer.shadowOpacity = 1
viewShadow.layer.shadowOffset = CGSize.zero
viewShadow.layer.shadowRadius = 5
self.view.addSubview(viewShadow)
 

Ressembler : entrez la description de l'image ici

20voto

Chhaileng Points 231

Cela fonctionne pour moi (Swift 3 et 4)

 yourView.layer.shadowColor = UIColor.gray.cgColor
yourView.layer.shadowOpacity = 0.3
yourView.layer.shadowOffset = CGSize.zero
yourView.layer.shadowRadius = 6
 

4voto

Florian Marcu Points 109

Voici comment ajouter une ombre à UIView dans Swift 4.1 :

 extension UIView {
 func dropShadow(scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.2
    layer.shadowOffset = .zero
    layer.shadowRadius = 1

    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
  }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X