VNDocumentCameraViewController in Xamarin Forms si blocca

Sep 19 2020

Vorrei usare il nuovo VNDocumentCameraViewControllerda iOS 13 nella mia app Xamarin Forms con un renderer personalizzato. Funziona, ma a volte dopo pochi secondi l'anteprima dalla fotocamera si blocca e non ho la possibilità di fare nulla sul controller della vista.

Per riprodurre l'errore, ho ridotto il mio codice a quanto segue:

Visualizzazione personalizzata:

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>

Renderer personalizzato

[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);
            }
        }
    }
}

Si verifica principalmente quando si sposta velocemente la fotocamera da sinistra a destra e indietro, ma a volte anche senza fare nulla.

Non ho trovato nessuno che tenti di usare VNDocumentCameraViewControllercon Xamarin Forms. Cosa sto sbagliando? O c'è un bug?

Risposte

2 StephanEngelhardt Sep 18 2020 at 22:33

Ho trovato la soluzione ... ho faticato due giorni su di esso e ora ho scoperto, che il garbage collector ha fatto il suo f *** lavoro e ha distrutto la mia scannerControllerdopo qualche tempo / chiamata Dispose()di VNDocumentCameraViewController. Se l'ho cambiato in un membro della classe ha funzionato:

Renderer personalizzato

[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);
            }
        }
    }
}