Генерация QR-кода с помощью SwiftUI показывает пустую картинку - PullRequest
0 голосов
/ 04 октября 2019

я пытаюсь создать QR-код в моем приложении. Проблема в том, что всякий раз, когда я делаю это, картинка - просто пустой квадрат. Я сократил код до основ, чтобы попытаться показать мою проблему.

struct ContentView: View {
    @State var image: Image = Image(systemName: "circle.fill")

    var body: some View {
        VStack {
            image
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width: 200, height: 200)
                .background(Color.green)

        }.onAppear {
            let myString = "Hello There"
            let data = myString.data(using: String.Encoding.ascii)
            guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return }
            qrFilter.setValue(data, forKey: "inputMessage")
            guard let qrImage = qrFilter.outputImage else { return }
            let transform = CGAffineTransform(scaleX: 10, y: 10)
            let scaledQrImage = qrImage.transformed(by: transform)
            self.image = Image(uiImage: UIImage(ciImage: scaledQrImage))
        }
    }
}

Результат таков: Screenshot of Result

1 Ответ

0 голосов
/ 04 октября 2019

Думаю, проблема в том, что ваш CIImage на самом деле не "произведен". Видите ли, CIImage - это просто рецепт для изображения, которое должно быть CIContext преобразовано в фактическое растровое изображение.

(плохо документированный) удобный инициализатор UIImage(ciImage:) работает только в том случае, если пункт назначения, которому вы назначаете изображение, понимает, что пиксели UIImage еще не там и должны быть отрисованы первыми. UIImageView может справиться с этим, но, похоже, SwiftUI Image этого не делает.

Что вам нужно сделать, это создать CIContext (один раз, возможно, как свойство вашего представления) и использовать егочтобы отобразить изображение штрих-кода в растровое изображение следующим образом:

let cgImage = self.ciContext.createCGImage(scaledQrImage, from: scaledQrImage.extent)
self.image = Image(uiImage: UIImage(cgImage: cgImage))
...