QrCodeView.swift 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import UIKit
  2. class QRCodeView: UIView {
  3. lazy var filter = CIFilter(name: "CIQRCodeGenerator")
  4. lazy var imageView = UIImageView()
  5. override init(frame: CGRect) {
  6. super.init(frame: frame)
  7. addSubview(imageView)
  8. }
  9. required init?(coder _: NSCoder) {
  10. fatalError("init(coder:) has not been implemented")
  11. }
  12. override func layoutSubviews() {
  13. super.layoutSubviews()
  14. imageView.frame = bounds
  15. }
  16. func generateCode(_ string: String, foregroundColor: UIColor = .black, backgroundColor: UIColor = .white) {
  17. guard let filter = filter,
  18. let data = string.data(using: .isoLatin1, allowLossyConversion: false) else {
  19. return
  20. }
  21. filter.setValue(data, forKey: "inputMessage")
  22. guard let ciImage = filter.outputImage else {
  23. return
  24. }
  25. let transformed = ciImage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))
  26. let invertFilter = CIFilter(name: "CIColorInvert")
  27. invertFilter?.setValue(transformed, forKey: kCIInputImageKey)
  28. let alphaFilter = CIFilter(name: "CIMaskToAlpha")
  29. alphaFilter?.setValue(invertFilter?.outputImage, forKey: kCIInputImageKey)
  30. if let outputImage = alphaFilter?.outputImage {
  31. imageView.tintColor = foregroundColor
  32. imageView.backgroundColor = backgroundColor
  33. imageView.image = UIImage(ciImage: outputImage, scale: 2.0, orientation: .up)
  34. .withRenderingMode(.alwaysTemplate)
  35. }
  36. }
  37. }