Skip to content

Instantly share code, notes, and snippets.

@kylebshr
Created November 11, 2019 16:36
Show Gist options
  • Save kylebshr/e898bac59a259ccb17605f8848fb34f7 to your computer and use it in GitHub Desktop.
Save kylebshr/e898bac59a259ccb17605f8848fb34f7 to your computer and use it in GitHub Desktop.
Attempts at rendering a view's layer with light/dark interface style
//
// ViewController.swift
// Rendering
//
// Created by Kyle Bashour on 11/11/19.
// Copyright © 2019 Kyle Bashour. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
private let imageView = UIImageView()
private let renderedView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
imageView.backgroundColor = .systemBlue
imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
imageView.frame = view.bounds
view.addSubview(imageView)
// Use dynamic color when setting up the rendered view
renderedView.backgroundColor = .systemBackground
renderImage()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
renderImage()
}
}
private func renderImage() {
renderedView.frame = view.bounds
let format = UIGraphicsImageRendererFormat(for: traitCollection)
let renderer = UIGraphicsImageRenderer(bounds: renderedView.bounds, format: format)
imageView.image = renderer.image { context in
self.renderedView.layer.render(in: context.cgContext)
}
}
// Setting overrideUserInterfaceStyle before rendering doesn't seem to work
private func renderImageWithOverride() {
renderedView.overrideUserInterfaceStyle = traitCollection.userInterfaceStyle
renderImage()
}
// Setting overrideUserInterfaceStyle and redrawing the layer doesn't work
private func renderImageWithOverrideAndDisplay() {
renderedView.overrideUserInterfaceStyle = traitCollection.userInterfaceStyle
renderedView.layer.setNeedsDisplay()
renderedView.layer.displayIfNeeded()
renderImage()
}
}
@pilot34
Copy link

pilot34 commented Oct 12, 2020

Stepped on the same problem. I found that overrideUserInterfaceStyle works for the UIView only if it is a subview of some UIWindow.

So this helps before calling renderer:

let window = UIWindow()
window.addSubview(renderedView)

@andrespch
Copy link

thanks a lot for this comment @pilot34

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment