MetadataObjectLayer CreateMetadataOverlay (AVMetadataObject metadataObject)
{
// Transform the metadata object so the bounds are updated to reflect those of the video preview layer.
var transformedMetadataObject = PreviewView.VideoPreviewLayer.GetTransformedMetadataObject (metadataObject);
// Create the initial metadata object overlay layer that can be used for either machine readable codes or faces.
var metadataObjectOverlayLayer = new MetadataObjectLayer {
MetadataObject = transformedMetadataObject,
LineJoin = CAShapeLayer.JoinRound,
LineWidth = 7,
StrokeColor = View.TintColor.ColorWithAlpha (0.7f).CGColor,
FillColor = View.TintColor.ColorWithAlpha (0.3f).CGColor
};
var barcodeMetadataObject = transformedMetadataObject as AVMetadataMachineReadableCodeObject;
if (barcodeMetadataObject != null) {
var barcodeOverlayPath = BarcodeOverlayPathWithCorners (barcodeMetadataObject.Corners);
metadataObjectOverlayLayer.Path = barcodeOverlayPath;
// If the metadata object has a string value, display it.
if (barcodeMetadataObject.StringValue.Length > 0) {
var barcodeOverlayBoundingBox = barcodeOverlayPath.BoundingBox;
var font = UIFont.BoldSystemFontOfSize (19).ToCTFont ();
var textLayer = new CATextLayer {
AlignmentMode = CATextLayer.AlignmentCenter,
Bounds = new CGRect (0, 0, barcodeOverlayBoundingBox.Size.Width, barcodeOverlayBoundingBox.Size.Height),
ContentsScale = UIScreen.MainScreen.Scale,
Position = new CGPoint (barcodeOverlayBoundingBox.GetMidX (), barcodeOverlayBoundingBox.GetMidY ()),
Wrapped = true,
// Invert the effect of transform of the video preview so the text is orientated with the interface orientation.
Transform = CATransform3D.MakeFromAffine (PreviewView.Transform).Invert (default (CATransform3D)),
AttributedString = new NSAttributedString (barcodeMetadataObject.StringValue, new CTStringAttributes {
Font = font,
ForegroundColor = UIColor.White.CGColor,
StrokeWidth = -5,
StrokeColor = UIColor.Black.CGColor
})
};
textLayer.SetFont (font);
metadataObjectOverlayLayer.AddSublayer (textLayer);
}
} else if (transformedMetadataObject is AVMetadataFaceObject) {
metadataObjectOverlayLayer.Path = CGPath.FromRect (transformedMetadataObject.Bounds);
}
return metadataObjectOverlayLayer;
}