Ssteinberg's answer helped me in iOS 10.2 and Swift 3. I was able to use my answer with UIVisualEffectView to create beautiful blur, but also with shadow. Converted to Swift 3 here:
let shadowLayer = CALayer() let mutablePath = CGMutablePath() let maskLayer = CAShapeLayer() let xOffset = CGFloat(4) let yOffset = CGFloat(6) let shadowOffset = CGSize(width: xOffset, height: yOffset) let shadowOpacity = Float(0.5) let shadowRadius = CGFloat(8) let shadowPath = UIBezierPath(rect: frame).cgPath let shadowColor = UIColor.black let shadowFrame = frame.insetBy(dx: -2 * shadowRadius, dy: -2 * shadowRadius).offsetBy(dx: xOffset, dy: yOffset) let shadowRect = CGRect(origin: .zero, size: shadowFrame.size) let shadowTransform = CGAffineTransform(translationX: -frame.origin.x - xOffset + 2 * shadowRadius, y: -frame.origin.y - yOffset + 2 * shadowRadius) shadowLayer.shadowOffset = shadowOffset shadowLayer.shadowOpacity = shadowOpacity shadowLayer.shadowRadius = shadowRadius shadowLayer.shadowPath = shadowPath shadowLayer.shadowColor = shadowColor.cgColor mutablePath.addRect(shadowRect) mutablePath.addPath(shadowLayer.shadowPath!, transform: shadowTransform) mutablePath.closeSubpath() maskLayer.frame = shadowFrame maskLayer.fillRule = kCAFillRuleEvenOdd maskLayer.path = mutablePath shadowLayer.mask = maskLayer layer.superlayer?.insertSublayer(shadowLayer, above: layer)
source share