Multiple shadows in iOS on a view.
Multiple shadows in iOS on a view.
- Subject: Multiple shadows in iOS on a view.
- From: Alex Zavatone via Cocoa-dev <email@hidden>
- Date: Thu, 10 Jun 2021 17:36:39 -0500
Does anyone have any tips for adding multiple shadows to a view or a view’s
CGLayer on iOS in either Objectice-C or Swift?
I’ve tried creating multiple CGLayers and adding shadows to each, then
inserting them in a view, creating multiple views and inserting the view above
or below the current view. Nothing works.
What seems to be happening is that when I create another CGLayer or view, there
is no shadow added to the other CGLayer or view, but the regular view certainly
gets a shadow.
FYI, I’m trying to replicate Sketch style shadows in iOS and our designers have
used multiple external shadows which is why I’m trying for multiple
views/layers.
Thanks in advance.
Alex Zavatone
Source:
extension (UIView) {
func addShadowToView(
color: UIColor?,
alpha: CGFloat,
x: CGFloat,
y: CGFloat,
blur: CGFloat,
spread: CGFloat
) {
layer.masksToBounds = false
layer.shadowColor = color?.cgColor
layer.shadowOpacity = Float(alpha)
layer.shadowOffset = CGSize(width: x, height: y)
layer.shadowRadius = blur / UIScreen.main.scale
if spread == 0 {
layer.shadowPath = nil
} else {
let deltaX = spread
let shadowRect = bounds.insetBy(dx: deltaX, dy: deltaX)
layer.shadowPath = CFBridgingRetain(UIBezierPath(rect: shadowRect))
as! CGPath
}
}
}
extension CALayer {
func applySketchShadow (
color: UIColor = .black,
alpha: Float = 0.5,
x: CGFloat = 0,
y: CGFloat = 2,
blur: CGFloat = 4,
spread: CGFloat = 0)
{
masksToBounds = false
shadowColor = color.cgColor
shadowOpacity = alpha
shadowOffset = CGSize(width: x, height: y)
shadowRadius = blur / 2.0
if spread == 0 {
shadowPath = nil
} else {
let dx = -spread
let rect = bounds.insetBy(dx: dx, dy: dx)
shadowPath = UIBezierPath(rect: rect).cgPath
}
}
}
And here’s how I’m trying to use it. Box2 is a UIImageView. It gets one
shadow, but never more than one. :/
alpha = 0.4
x = 0
y = 8.0
blur = 10.0
spread = 10.0 // 1
box2.addShadowToView(color: color, alpha: alpha, x: x, y: y, blur:
blur, spread: spread)
let myView1 = UIView(frame: box2.bounds)
myView1.addShadowToView(color: color, alpha: alpha, x: x, y: y, blur:
blur, spread: spread)
box2.insertSubview(myView1, belowSubview: box2)
let myView2 = UIView(frame: box2.bounds)
myView2.addShadowToView(color: color, alpha: alpha, x: x, y: y, blur:
blur, spread: spread)
box2.insertSubview(myView2, belowSubview: box2)
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden