这可能比它需要的稍微复杂一些,但这里有一个解决方案。
使用以下方法扩展UIView:
extension UIView {
// Note: the method needs the view from which the context is taken as an argument.
func dropShadow(superview: UIView) {
// Get context from superview
UIGraphicsBeginImageContext(self.bounds.size)
superview.drawViewHierarchyInRect(CGRect(x: -self.frame.minX, y: -self.frame.minY, width: superview.bounds.width, height: superview.bounds.height), afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Add a UIImageView with the image from the context as a subview
let imageView = UIImageView(frame: self.bounds)
imageView.image = image
imageView.layer.cornerRadius = self.layer.cornerRadius
imageView.clipsToBounds = true
self.addSubview(imageView)
// Bring the background color to the front, alternatively set it as UIColor(white: 1, alpha: 0.2)
let brighter = UIView(frame: self.bounds)
brighter.backgroundColor = self.backgroundColor ?? UIColor(white: 1, alpha: 0.2)
brighter.layer.cornerRadius = self.layer.cornerRadius
brighter.clipsToBounds = true
self.addSubview(brighter)
// Set the shadow
self.layer.masksToBounds = false
self.layer.shadowColor = UIColor.darkGrayColor().CGColor
self.layer.shadowOffset = CGSizeMake(0, 5)
self.layer.shadowOpacity = 0.35
self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: self.layer.cornerRadius).CGPath
}
}
用法,考虑背景视图命名为view:
let shadowView = UIView(frame: CGRect(x: 100, y: 100, width: 300, height: 200))
shadowView.layer.cornerRadius = 15.0
shadowView.dropShadow(view)
view.addSubview(shadowView)
这会导致这样的视图:
注意:dropShadow 方法不能从viewDidLoad 调用,因为这会导致图形上下文出现问题。所以,在viewWillAppear最早使用这个方法来得到上述结果。
这是背景视图的代码,以防万一有人想在 Playground 中进行测试:
let view = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 400))
view.backgroundColor = UIColor.clearColor()
let color1 = UIColor(hue: 0.39, saturation: 0.7, brightness: 1.0, alpha: 1.0).CGColor
let color2 = UIColor(hue: 0.51, saturation: 0.9, brightness: 0.6, alpha: 1.0).CGColor
let gradient = CAGradientLayer()
gradient.frame = view.frame
gradient.colors = [color1, color2]
gradient.startPoint = CGPoint(x: 0, y: 0)
gradient.endPoint = CGPoint(x: 1, y: 1)
view.layer.insertSublayer(gradient, atIndex: 0)