VNDocumentCameraViewController w Xamarin Forms zawiesza się

Sep 19 2020

Chciałbym używać nowego VNDocumentCameraViewControllerz iOS 13 w mojej aplikacji Xamarin Forms z niestandardowym modułem renderującym. Działa, ale czasami po kilku sekundach podgląd z kamery zawiesza się i nie mam szans na nic zrobić na kontrolerze widoku.

Aby odtworzyć błąd, zredukowałem mój kod do następującego:

Widok niestandardowy:

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>

Niestandardowy renderer

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

Występuje głównie podczas szybkiego przesuwania aparatu od lewej do prawej iz powrotem, ale czasami także bez robienia czegokolwiek.

Nie znalazłem nikogo, kto próbuje użyć VNDocumentCameraViewControllerz Xamarin Forms. Co robię źle? Czy jest błąd?

Odpowiedzi

2 StephanEngelhardt Sep 18 2020 at 22:33

Znalazłem rozwiązanie ... Walczyłem dwa dni na nim, a teraz dowiedziałem się, że garbage collector nie jego f *** pracy i zniszczył mój scannerControllerpo pewnym czasie / wywoływanego Dispose()z VNDocumentCameraViewController. Jeśli zmieniłem to na członka klasy, zadziałało:

Niestandardowy renderer

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