VNDocumentCameraViewController en Xamarin Forms se congela

Sep 19 2020

Me gustaría usar lo nuevo VNDocumentCameraViewControllerde iOS 13 en mi aplicación Xamarin Forms con un renderizador personalizado. Funciona, pero a veces, después de unos segundos, la vista previa de la cámara se congela y no tengo la oportunidad de hacer nada en el controlador de vista.

Para reproducir el error, reduje mi código a lo siguiente:

Vista personalizada:

public sealed class Scanner : View
{
}

MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App1"
             x:Class="App1.MainPage">
    <local:Scanner />
</ContentPage>

Renderizador personalizado

[assembly: ExportRenderer(typeof(App1.Scanner), typeof(App1.iOS.ScannerRenderer))]

namespace App1.iOS
{
    public class ScannerRenderer : ViewRenderer<Scanner, UIView>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Scanner> e)
        {
            base.OnElementChanged(e);

            if (this.Control == null)
            {
                VNDocumentCameraViewController scannerController = new VNDocumentCameraViewController();
                this.SetNativeControl(scannerController.View);
            }
        }
    }
}

Ocurre principalmente cuando se mueve la cámara rápidamente de izquierda a derecha y hacia atrás, pero a veces también sin hacer nada.

No encontré a nadie que intente usar el VNDocumentCameraViewControllercon Xamarin Forms. ¿Qué estoy haciendo mal? ¿O hay un error?

Respuestas

2 StephanEngelhardt Sep 18 2020 at 22:33

He encontrado la solución ... Me costó dos días en él y ahora me di cuenta, que el recolector de basura hizo su f *** empleo y destruyó mi scannerControllerdespués de algún tiempo / llamada Dispose()de VNDocumentCameraViewController. Si lo cambié a un miembro de la clase, funcionó:

Renderizador personalizado

[assembly: ExportRenderer(typeof(App1.Scanner), typeof(App1.iOS.ScannerRenderer))]

namespace App1.iOS
{
    public class ScannerRenderer : ViewRenderer<Scanner, UIView>
    {
        private VNDocumentCameraViewController scannerController;
    
        protected override void OnElementChanged(ElementChangedEventArgs<Scanner> e)
        {
            base.OnElementChanged(e);

            if (this.Control == null)
            {
                this.scannerController = new VNDocumentCameraViewController();
                this.SetNativeControl(this.scannerController.View);
            }
        }
    }
}