Can't set cornerRadius AND shadow on layer that has an image view stretched to its bounds?

前端 未结 5 728
醉话见心
醉话见心 2020-12-31 03:00

This is stumping me. I have a UIView (call it \"parent\"). The bottommost subview of that view is a UIImageView (call it \"child\"), whose frame occupies the entirety of the

5条回答
  •  不思量自难忘°
    2020-12-31 03:29

    With Swift 3, you can choose one of the two following code snippets in order to set cornerRadius and shadow on an image view or on a view that contains an image layer.


    #1. Using UIView, CALayer and Spring and Struts

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // constants
            let radius: CGFloat = 20, dimension: CGFloat = 200, offset = 8
            let frame = CGRect(x: 0, y: 0, width: 200, height: 200)
    
            // custom view
            let customView = UIView(frame: frame)
            customView.contentMode = .scaleAspectFill
    
            // image layer
            let imageLayer = CALayer()
            imageLayer.contentsGravity = kCAGravityResizeAspectFill
            imageLayer.contents = UIImage(named: "image")!.cgImage
            imageLayer.masksToBounds = true
            imageLayer.frame = frame
            imageLayer.cornerRadius = radius
            imageLayer.masksToBounds = true
    
            // rounded layer
            let roundedLayer = CALayer()
            roundedLayer.shadowColor = UIColor.darkGray.cgColor
            roundedLayer.shadowPath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: dimension, height: dimension), cornerRadius: radius).cgPath
            roundedLayer.shadowOffset = CGSize(width: offset, height: offset)
            roundedLayer.shadowOpacity = 0.8
            roundedLayer.shadowRadius = 2
            roundedLayer.frame = frame
    
            // views and layers hierarchy
            customView.layer.addSublayer(imageLayer)
            customView.layer.insertSublayer(roundedLayer, below: imageLayer)
            view.addSubview(customView)
    
            // layout
            customView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
            customView.autoresizingMask = [UIViewAutoresizing.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
        }
    
    }
    

    #2. Using UIView, UIImageView, CALayer and Auto Layout

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // constants
            let radius: CGFloat = 20, dimension: CGFloat = 200, offset = 8
    
            // image view
            let imageView = UIImageView(image: UIImage(named: "image"))
            imageView.contentMode = .scaleAspectFill
            imageView.layer.cornerRadius = radius
            imageView.layer.masksToBounds = true
    
            // rounded view
            let roundedView = UIView()
            roundedView.layer.shadowColor = UIColor.darkGray.cgColor
            roundedView.layer.shadowPath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: dimension, height: dimension), cornerRadius: radius).cgPath
            roundedView.layer.shadowOffset = CGSize(width: offset, height: offset)
            roundedView.layer.shadowOpacity = 0.8
            roundedView.layer.shadowRadius = 2
    
            // views hierarchy
            roundedView.addSubview(imageView)
            view.addSubview(roundedView)
    
            // layout
            imageView.translatesAutoresizingMaskIntoConstraints = false
            roundedView.translatesAutoresizingMaskIntoConstraints = false
            roundedView.widthAnchor.constraint(equalToConstant: dimension).isActive = true
            roundedView.heightAnchor.constraint(equalToConstant: dimension).isActive = true
            imageView.widthAnchor.constraint(equalTo: roundedView.widthAnchor).isActive = true
            imageView.heightAnchor.constraint(equalTo: roundedView.heightAnchor).isActive = true
            roundedView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            roundedView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
            imageView.centerXAnchor.constraint(equalTo: roundedView.centerXAnchor).isActive = true
            imageView.centerYAnchor.constraint(equalTo: roundedView.centerYAnchor).isActive = true
        }
    
    }
    

    Both code snippets generate the following display:


    You can find more ways to combine images with rounded corners and shadow on this Github repo.

提交回复
热议问题