Created
November 11, 2019 16:36
-
-
Save kylebshr/e898bac59a259ccb17605f8848fb34f7 to your computer and use it in GitHub Desktop.
Attempts at rendering a view's layer with light/dark interface style
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thanks a lot for this comment @pilot34