Re: Multiple shadows in iOS on a view.
Re: Multiple shadows in iOS on a view.
- Subject: Re: Multiple shadows in iOS on a view.
- From: Mike Abdullah via Cocoa-dev <email@hidden>
- Date: Fri, 11 Jun 2021 15:11:03 +0100
Your description seems a bit confused here.
Why declare the applySketchShadow() method but never use it?
The force conversion of UIBezierPath to CGPath smells, and suggests you never
hit this code path. If so, I think you may have layers with no content and no
path, so will not generate a shadow.
Can you post a sample project instead? Much easier to understand.
Mike.
> On 10 Jun 2021, at 23:36, Alex Zavatone via Cocoa-dev
> <email@hidden> wrote:
>
> 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
_______________________________________________
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