Skip to main content
Version: 7.0.1

Adding AR Overlays

In the previous section we covered how to vizualize the scan process using the BarcodeBatchBasicOverlay. In this section we will cover how to add custom AR overlays to your MatrixScan application.

There are two ways to add custom AR overlays to your application:

The first option is the easiest and recommended approach for most applications. It covers adding, removing, and animating the overlay’s views whenever needed and is also flexible enough to cover the majority of use cases.

Using BarcodeBatchAdvancedOverlay

The advanced overlay combined with its listener offers an easy way of adding augmentations to your SDCDataCaptureView. In this example we'll add a view above each barcode showing its content.

First, create a new instance of SDCBarcodeBatchAdvancedOverlay and add it to your SDCDataCaptureView:

let overlay = BarcodeBatchAdvancedOverlay(barcodeBatch: barcodeBatch, for: captureView)

There are two ways to proceed from here:

note

The second way will take priority over the first one, meaning that if a view for a barcode has been set using SDCBarcodeBatchAdvancedOverlay.setView:forTrackedBarcode:, the function SDCBarcodeBatchAdvancedOverlayDelegate.barcodeBatchAdvancedOverlay:viewForTrackedBarcode: won’t be invoked for that specific barcode.

Using the Delegate

For this option, keep in mind that:

func barcodeBatchAdvancedOverlay(_ overlay: BarcodeBatchAdvancedOverlay,
viewFor trackedBarcode: TrackedBarcode) -> UIView? {
// Create and return the view you want to show for this tracked barcode. You can also return nil, to have no view for this barcode.
let label = UILabel()
label.text = trackedBarcode.barcode.data
label.backgroundColor = .white
label.sizeToFit()
return label
}

func barcodeBatchAdvancedOverlay(_ overlay: BarcodeBatchAdvancedOverlay,
anchorFor trackedBarcode: TrackedBarcode) -> Anchor {
// As we want the view to be above the barcode, we anchor the view's center to the top-center of the barcode quadrilateral.
// Use the function below to adjust the position of the view by providing an offset.
return .topCenter
}

func barcodeBatchAdvancedOverlay(_ overlay: BarcodeBatchAdvancedOverlay,
offsetFor trackedBarcode: TrackedBarcode) -> PointWithUnit {

// This is the offset that will be applied to the view.
// You can use .fraction to give a measure relative to the view itself, the sdk will take care of transforming this into pixel size.
// We now center horizontally and move up the view to make sure it's centered and above the barcode quadrilateral by half of the view's height.
return PointWithUnit(
x: FloatWithUnit(value: 0, unit: .fraction),
y: FloatWithUnit(value: -1, unit: .fraction)
)
}

Using the Setters

The function SDCBarcodeBatchListener.barcodeBatch:didUpdate:frameData: gives you access to a session. This session object contains all added, updated, and removed tracked barcodes.

From there you can create the view you want to display, and then call:

func barcodeBatch(_ barcodeBatch: BarcodeBatch,
didUpdate session: BarcodeBatchSession,
frameData: FrameData) {
DispatchQueue.main.async {
for trackedBarcode in session.addedTrackedBarcodes {
let label = UILabel()
label.text = trackedBarcode.barcode.data
label.backgroundColor = .white
label.sizeToFit()
self.overlay.setView(label, for: trackedBarcode)
self.overlay.setAnchor(.topCenter, for: trackedBarcode)
let point = PointWithUnit(x: FloatWithUnit(value: 0, unit: .fraction),
y: FloatWithUnit(value: -1, unit: .fraction))
self.overlay.setOffset(point, for: trackedBarcode)
}
}
}

Using Custom Implementations

If you do not want to use the overlay, it is also possible to add augmented reality features based on the tracking identifier and the quadrilateral coordinates of every tracked barcode. When doing so, keep the following in mind:

func barcodeBatch(_ barcodeBatch: BarcodeBatch,
didUpdate session: BarcodeBatchSession,
frameData: FrameData) {
DispatchQueue.main.async {
for lostTrackIdentifier in session.removedTrackedBarcodes {
// You now know the identifier of the tracked barcode that has been lost. Usually here you would remove the views associated.
}

for trackedBarcode in session.addedTrackedBarcodes {
// Fixed identifier for the tracked barcode.
let trackingIdentifier = trackedBarcode.identifier

// Current location of the tracked barcode.
let location = trackedBarcode.location
let quadrilateral = self.captureView.viewQuadrilateral(forFrameQuadrilateral: location)

// You now know this new tracking's identifier and location. Usually here you would create and show the views.
}
}
}