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. P>
p>
5 Réponses :
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 p>
Il n'y a pas de manière native de faire ce que vous demandez, p>
Essayez quelque chose en utilisant ces propriétés de votre vue. Cela pourrait se retrouver avec quelque chose il fuit à la manière de la libération de CGPath (rect) à la fin désolé. p> p>
Cela ne fonctionne pas lorsque la vue est transparente - alpha 0
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 P>
Après avoir recherché et ne pas trouver une réponse à cette question, j'ai écrit l'extension suivante dans Swift 5: EXEMPLE D'UTILISATION: P> myView.makeClearViewWithShadow(cornderRadius: 20, shadowColor: UIColor.black.cgColor, shadowOpacity: 0.5, shadowRadius: 30)
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
}
}