微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CAlayer到带有阴影的UIImage错误

如何解决CAlayer到带有阴影的UIImage错误

我正在尝试通过CALayer渲染UIImage并保持阴影,但是生成的图像与CALayer中的图像不同,为什么?

代码

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        self.view.backgroundColor = UIColor.black
        
        
        let containerLayer = CALayer()
        containerLayer.frame = CGRect(x: 100,y: 20,width: 40,height: 200)
        
        let layerGradient = CAGradientLayer()
        layerGradient.frame = CGRect(x: 15,y: 0,width: 10,height: 200)
        layerGradient.startPoint = CGPoint(x: 0,y: 0.5)
        layerGradient.endPoint = CGPoint(x: 1,y: 0.5)
        layerGradient.colors = [UIColor.black.cgColor,UIColor.white.cgColor,UIColor.black.cgColor]
        layerGradient.shadowOffset = CGSize(width: -3,height: 0)
        layerGradient.shadowPath = UIBezierPath(rect: CGRect(x: 0,width: 15,height: 200)).cgPath
        layerGradient.shadowRadius = 7
        layerGradient.shadowColor = UIColor.black.cgColor
        layerGradient.shadowOpacity = 1
        
        containerLayer.backgroundColor = UIColor.white.cgColor
        
        containerLayer.addSublayer(layerGradient)
        self.view.layer.addSublayer(containerLayer)
        
        
        let imageSeparator = imageFromLayer(layer: containerLayer)
               
        let img = UIImageView(image: imageSeparator)
        self.view.addSubview(img)
        
    }

    func imageFromLayer(layer:CALayer) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(layer.frame.size,layer.isOpaque,layer.contentsScale)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        let outputimage = UIGraphicsGetimageFromCurrentimageContext()
        UIGraphicsEndImageContext()
        return outputimage!
    }

CALayer

enter image description here

结果UIImage

enter image description here

我在哪里错了?

解决方法

经过搜索和测试后,发现问题出在shadowPath中,您只能通过UIView和drawhierarchy https://developer.apple.com/documentation/uikit/uiview/1622589-drawhierarchy

来呈现它
extension UIImage{
    convenience init(view: UIView) {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size,view.isOpaque,0.0)
    view.drawHierarchy(in: view.bounds,afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    self.init(cgImage: (image?.cgImage)!)

  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。