10
votes

Comment ajouter Shadow à un UIView transparent?

Comment puis-je reproduire cette observation? Mon problème, que si j'utilise High Alpha Color ou ClearColor, il n'y a pas d'ombre portée, si j'utilise une couleur alpha basse, je ne peux pas voir l'ombre portée sous la plaque. Comme le niveau du volume change (pièce colorée), l'ombre bouge également, ce n'est donc pas pur Photoshop.

Entrez la description de l'image ici


0 commentaires

5 Réponses :


0
votes

Vous aurez deux images que l'une est l'image colorée et l'autre sera l'ombre de celui-ci L'ombre augmentera et augmentera de largeur avec l'expansion de la partie colorée

Il n'y a pas de manière native de faire ce que vous demandez,


0 commentaires

9
votes

Essayez quelque chose en utilisant ces propriétés de votre vue. Cela pourrait se retrouver avec quelque chose xxx

il fuit à la manière de la libération de CGPath (rect) à la fin désolé.


1 commentaires

Cela ne fonctionne pas lorsque la vue est transparente - alpha 0



0
votes

J'ai utilisé un UIImageView pour fournir l'ombre. J'ai créé une image de 1 pixel de large, de 12 pixels hauts. L'image était noire, mais l'alpha était un gradient de 0,5 en haut à 0,0 au bas, par exemple. RGBA 1.0,1.0,1.0.5 -> 1.0,1.0,1.0,0,0 - J'ai ensuite placé l'UIImageView juste en dessous de la vue ayant besoin de l'ombre et l'étirée horizontalement sur la largeur de la vue. J'ai également utilisé cela lorsque j'avais besoin de modifier l'intensité de l'ombre lors d'une vue de défilement ci-dessous défile, en modifiant la valeur UiImageView.alpha


0 commentaires

6
votes

Après avoir recherché et ne pas trouver une réponse à cette question, j'ai écrit l'extension suivante dans Swift 5: XXX PRE>

EXEMPLE D'UTILISATION: P>

myView.makeClearViewWithShadow(cornderRadius: 20, shadowColor: UIColor.black.cgColor, shadowOpacity: 0.5, shadowRadius: 30)


0 commentaires

0
votes

Ma solution était de sous-classe UIView. Cela fonctionne même si la vue est redimensionnée.

import UIKit

class ShadowOutsideView: UIView {
  let color: CGColor
  let opacity: Float
  let radius: CGFloat
  let offset: CGSize
  let shadowView = UIView()
  
  init(
    color: CGColor,
    opacity: Float,
    radius: CGFloat,
    offset: CGSize
  ) {
    self.color = color
    self.opacity = opacity
    self.radius = radius
    self.offset = offset
    super.init(frame: CGRect.zero)
    shadowView.frame = bounds
    shadowView.backgroundColor = .black
    shadowView.layer.shadowColor = color
    shadowView.layer.shadowOpacity = opacity
    shadowView.layer.shadowRadius = radius
    shadowView.layer.shadowOffset = offset
    shadowView.layer.masksToBounds = false
    self.addSubview(shadowView)
    
  }
  
  override func layoutSubviews() {
    shadowView.frame = bounds
    let inset = -(max(abs(offset.width), abs(offset.height))+radius) - 10 
    // - 10, had to put 10px extra otherwise it would cut shadow
    let maskFrame = bounds.inset(by: UIEdgeInsets(top: inset, left: inset, bottom: inset, right: inset))
    let p = CGMutablePath()
    p.addRect(maskFrame)
    p.addRect(bounds)
    let s = CAShapeLayer()
    s.path = p
    s.fillRule = .evenOdd
    shadowView.layer.mask = s
  }
}


0 commentaires