VNDocumentCameraViewController dans Xamarin Forms se bloque

Sep 19 2020

Je souhaite utiliser la nouvelle version VNDocumentCameraViewControllerd'iOS 13 dans mon application Xamarin Forms avec un moteur de rendu personnalisé. Cela fonctionne, mais parfois après quelques secondes, l'aperçu de la caméra se fige et je n'ai aucune chance de faire quoi que ce soit sur le contrôleur de vue.

Pour reproduire l'erreur, j'ai réduit mon code comme suit:

Vue personnalisée:

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>

Rendu personnalisé

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

Cela se produit principalement lors du déplacement rapide de la caméra de gauche à droite et en arrière, mais parfois aussi sans rien faire.

Je n'ai trouvé personne qui essaie d'utiliser le VNDocumentCameraViewControlleravec Xamarin Forms. Qu'est-ce que je fais mal? Ou y a-t-il un bug?

Réponses

2 StephanEngelhardt Sep 18 2020 at 22:33

J'ai trouvé la solution ... Je luttais deux jours et maintenant j'ai découvert que le garbage collector a fait son f *** emploi et détruit mon scannerControlleraprès un certain temps / appelé Dispose()de VNDocumentCameraViewController. Si je l'ai changé en un membre de la classe, cela a fonctionné:

Rendu personnalisé

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