SwiftUI · · 3 min read

How to Build a Barcode Generator Using SwiftUI

How to Build a Barcode Generator Using SwiftUI

I recently received a question from a friend regarding barcode generation using Swift. The CoreImage framework provides convenient built-in APIs for creating various types of barcodes, including QR codes. In this tutorial, we’ll explore how you can leverage SwiftUI and these powerful APIs to develop your very own barcode generator.

Let’s first take a look at the final result. It’s a very elementary barcode generation app with simple UIs. When you enter text into the designated field, the app instantly generates the corresponding barcode using the Code 128 format, which is used for alphanumeric or numeric-only barcodes.

swiftui-barcode-generator

Creating the Barcode Generator

Assuming you have created a new SwiftUI project in Xcode, open the ContentView.swift file. Start by importing the required package for using the filters:

import CoreImage.CIFilterBuiltins

Next, we create a BarcodeGenerator struct for generating the barcode:

struct BarcodeGenerator {
    let context = CIContext()
    let generator = CIFilter.code128BarcodeGenerator()

    func generateBarcode(text: String) -> Image {
        let generator = CIFilter.code128BarcodeGenerator()
        generator.message = Data(text.utf8)

        if let outputImage = generator.outputImage,
           let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {

            let uiImage = UIImage(cgImage: cgImage)

            return Image(uiImage: uiImage)
        }

        return Image(systemName: "barcode")

    }
}

To create the barcode, we declare two variables: the context and the Code 128 generator. If you explore the CIFilter class, you will discover other code generators such as the QR code generator and the Aztec code generator. However, for this demonstration, we will focus on using the Code 128 barcode generator.

The generateBarcode method accepts a string input and returns the generated barcode image. Within the method, we first initialize the code128BarcodeGenerator and assign the input text to its message property. As the message property expects Data, we convert the input text to Data. Subsequently, we retrieve the generated barcode image from the outputImage property of the generator.

Since the resulting image is of type CIImage, we utilize the createCGImage method of the context to convert it to a CGImage. We then proceed with additional steps to convert it into an Image.

Building the User Interface

Now that we have finished building the barcode generator, let’s move on to developing the user interface for displaying the barcode image.

First, declare the following properties in ContentView for the input text and the barcode generator:

@State private var inputText = ""
var barcodeGenerator = BarcodeGenerator()

For the user interface, let’s keep it simple and lay out all the views in a VStack like this:

VStack(alignment: .leading) {

    Text("Barcode Generator")
        .font(.system(size: 60, weight: .black, design: .rounded))

    Text("Please key in your barcode data in the text field")
        .font(.headline)
        .padding(.bottom, 20)

    TextField("", text: $inputText)
        .padding()
        .font(.title)
        .background(Color(.systemGray6))

    Spacer()

    VStack(spacing: 0) {
        barcodeGenerator.generateBarcode(text: inputText)
            .resizable()
            .scaledToFit()

        Text(inputText.isEmpty ? "Unknown data" : inputText)
    }

}
.padding()

On the screen, we have a text field that captures user input. Towards the bottom of the screen, the app displays the generated barcode. In case there is no user input, we show a default image with the caption “Unknown data.”

That’s it! You should now be able to test the app in the preview pane. Simply enter any text in the text field, and the app will automatically generate the barcode on the fly.

swiftui-barcode-generator-code-128

Summary

This tutorial provides a comprehensive guide on building a barcode generator using the CoreImage framework and SwiftUI. While the focus is on creating a Code 128 barcode, you can easily modify the code to support multiple types of barcodes including QR codes.

Read next