Skip to content

Instantly share code, notes, and snippets.

@rdelrosario
Last active August 17, 2017 05:18
Show Gist options
  • Save rdelrosario/f586a8d14d58a9d92525ac03053ef6c5 to your computer and use it in GitHub Desktop.
Save rdelrosario/f586a8d14d58a9d92525ac03053ef6c5 to your computer and use it in GitHub Desktop.
using System;
using AVFoundation;
using Foundation;
using OverlayCameraSample.Controls;
using OverlayCameraSample.iOS.Controls;
using OverlayCameraSample.iOS.Renderers;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using OverlayCameraSample.iOS.Extensions;
[assembly: ExportRenderer(typeof(CameraPreview), typeof(CameraPreviewRenderer))]
namespace OverlayCameraSample.iOS.Renderers
{
public class CameraPreviewRenderer : ViewRenderer<CameraPreview, UICameraPreview>
{
bool isBusy;
UICameraPreview uiCameraPreview;
protected override void OnElementChanged(ElementChangedEventArgs<CameraPreview> e)
{
base.OnElementChanged(e);
if (Control == null)
{
uiCameraPreview = new UICameraPreview(e.NewElement.Camera, e.NewElement.CameraMode);
SetNativeControl(uiCameraPreview);
}
if (e.OldElement != null)
{
// Unsubscribe
uiCameraPreview.ImageCaptured -= OnImageCaptured;
}
if (e.NewElement != null)
{
// Subscribe
uiCameraPreview.ShowFaceOverlay = Element.ShowCircleOverlayMask;
uiCameraPreview.FaceOverlayColor = Element.CircleOverlayColor.ToUIColor();
uiCameraPreview.FaceOverlayOpacity = Element.CircleOverlayOpacity;
uiCameraPreview.StopOnCapture = Element.CameraStopOnImageCapture;
uiCameraPreview.ImageCaptured += OnImageCaptured;
Element.TakePictureCommand = new Command(async () =>
{
if (isBusy) return;
isBusy = true;
await uiCameraPreview.CaptureImage();
isBusy = false;
});
Element.PrepareCameraCommand = new Command(() => uiCameraPreview.StartCamera(Element.Camera, Element.CameraMode));
Element.StopCameraCommand = new Command(() => uiCameraPreview.StopCamera());
}
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (CameraPreview.FlashProperty.PropertyName == e.PropertyName)
{
uiCameraPreview.FlashConfiguration(Element.Flash);
}
else if (CameraPreview.CameraProperty.PropertyName == e.PropertyName)
{
Element.Flash = false;
uiCameraPreview.Flip();
}
else if (CameraPreview.ShowCircleOverlayMaskProperty.PropertyName == e.PropertyName)
{
uiCameraPreview.ShowFaceOverlay = Element.ShowCircleOverlayMask;
}
else if (CameraPreview.CircleOverlayColorProperty.PropertyName == e.PropertyName)
{
uiCameraPreview.FaceOverlayColor = Element.CircleOverlayColor.ToUIColor();
}
else if (CameraPreview.CircleOverlayOpacityProperty.PropertyName == e.PropertyName)
{
uiCameraPreview.FaceOverlayOpacity = Element.CircleOverlayOpacity;
}
else if (CameraPreview.CameraStopOnImageCaptureProperty.PropertyName == e.PropertyName)
{
uiCameraPreview.StopOnCapture = Element.CameraStopOnImageCapture;
}
}
void OnCameraPreviewTapped(object sender, EventArgs e)
{
if (uiCameraPreview.IsPreviewing)
{
uiCameraPreview.CaptureSession.StopRunning();
uiCameraPreview.IsPreviewing = false;
}
else
{
uiCameraPreview.CaptureSession.StartRunning();
uiCameraPreview.IsPreviewing = true;
}
}
void OnImageCaptured(object sender, Tuple<string, bool, long> imageParams)
{
Element?.OnPictureTaken(this, imageParams);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
Control?.CaptureSession?.Dispose();
Control?.Dispose();
}
base.Dispose(disposing);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment