Как сделать UIImageView в UIImage - PullRequest
       19

Как сделать UIImageView в UIImage

0 голосов
/ 14 сентября 2018

Я создал UIImageView BackView , чтобы создать размытый фон с градиентным слоем к черному.(Для создания чего-то похожего на профиль художников Spotify.)

Я хочу разместить это изображение за панелью навигации для улучшения внешнего вида.Но для этого мне нужен UIImage.Я не могу просто взять BackView.image, потому что это просто исходное изображение без BlurryView или слоя градиента.

Так что я нашел этот код в HackingWithSwift :

let renderer = UIGraphicsImageRenderer(size: rect.size)
let image = renderer.image { ctx in
    backView.drawHierarchy(in: backView.bounds, afterScreenUpdates: true)
}

Но это не делает вид, как это печально.Он рисует только градиентный слой без чего-либо позади него.Есть ли у кого-нибудь фрагмент кода, чтобы получить все подпредставления в отрендеренное изображение?

Ниже я добавил свой UIImageView-класс и функцию, которая обрабатывает рендерер:

class BackView: UIImageView {

var thisframe: CGRect
var anImage: UIImage? {
    didSet {
        setupImage()
    }
}

override init(frame: CGRect) {
    self.thisframe = frame
    super.init(frame: .zero)
    self.anImage = UIImage(named: "gray")
    setupImage()
}

func setupImage() {
    self.image = anImage
    self.addSubview(blurry)
    self.addSubview(blacky)
    gradientLayer.removeFromSuperlayer()
    self.layer.insertSublayer(gradientLayer, at: 1)
    print(gradientLayer.bounds)
}

lazy var blurry: UIVisualEffectView = {
    let blur = UIVisualEffectView()
    blur.effect = UIBlurEffect(style: .regular)
    blur.frame = (thisframe)
    return blur
}()

lazy var blacky: UIImageView = {
    let black = UIImageView()
    black.backgroundColor = .black
    black.alpha = 0.0
    black.frame = (thisframe)
    return black
}()

lazy var gradientLayer: CAGradientLayer = {
    let gradient = CAGradientLayer()
    gradient.colors = [UIColor.black.withAlphaComponent(0.0).cgColor,
                       UIColor.black.withAlphaComponent(1.0).cgColor]
    gradient.frame = (thisframe)
    gradient.startPoint = CGPoint(x: 0.5, y: 0)
    gradient.endPoint = CGPoint(x: 0.5, y: 1)
    return gradient
}()

И вот функция:

    func setupNavBarBackground() {
    let renderer = UIGraphicsImageRenderer(size: rect.size)
    let image = renderer.image { ctx in
        backView.drawHierarchy(in: backView.bounds, afterScreenUpdates: true)
    }
    self.navigationController?.navigationBar.barTintColor = .clear
    self.navigationController?.navigationBar.backgroundColor = .clear
    self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)
    self.navigationController?.navigationBar.shadowImage = image
}
...