QRCodeDisplayView.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // LoopFollow
  2. // QRCodeDisplayView.swift
  3. import SwiftUI
  4. import UIKit
  5. struct QRCodeDisplayView: View {
  6. let qrCodeString: String
  7. let size: CGSize
  8. let foregroundColor: UIColor
  9. let backgroundColor: UIColor
  10. @State private var qrCodeImage: UIImage?
  11. init(
  12. qrCodeString: String,
  13. size: CGSize = CGSize(width: 250, height: 250),
  14. foregroundColor: UIColor = .black,
  15. backgroundColor: UIColor = .white
  16. ) {
  17. self.qrCodeString = qrCodeString
  18. self.size = size
  19. self.foregroundColor = foregroundColor
  20. self.backgroundColor = backgroundColor
  21. }
  22. var body: some View {
  23. VStack(spacing: 16) {
  24. if let qrCodeImage = qrCodeImage {
  25. Image(uiImage: qrCodeImage)
  26. .resizable()
  27. .aspectRatio(contentMode: .fit)
  28. .frame(width: size.width, height: size.height)
  29. .cornerRadius(12)
  30. .shadow(radius: 4)
  31. } else {
  32. RoundedRectangle(cornerRadius: 12)
  33. .fill(Color.gray.opacity(0.3))
  34. .frame(width: size.width, height: size.height)
  35. .overlay(
  36. ProgressView()
  37. .scaleEffect(1.5)
  38. )
  39. }
  40. }
  41. .onAppear {
  42. generateQRCode()
  43. }
  44. }
  45. private func generateQRCode() {
  46. DispatchQueue.global(qos: .userInitiated).async {
  47. let image = QRCodeGenerator.generateQRCode(
  48. from: qrCodeString,
  49. size: size,
  50. foregroundColor: foregroundColor,
  51. backgroundColor: backgroundColor
  52. )
  53. DispatchQueue.main.async {
  54. self.qrCodeImage = image
  55. }
  56. }
  57. }
  58. }
  59. #Preview {
  60. QRCodeDisplayView(qrCodeString: "https://example.com/test")
  61. .padding()
  62. }