VNDocumentCameraViewController в Xamarin Forms зависает

Я хотел бы использовать новый VNDocumentCameraViewControllerиз iOS 13 в моем приложении Xamarin Forms с настраиваемым средством визуализации. Это работает, но иногда через несколько секунд предварительный просмотр с камеры зависает, и у меня нет возможности что-либо сделать на контроллере представления.

Чтобы воспроизвести ошибку, я сократил свой код до следующего:

Пользовательский вид:

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>

Пользовательский рендерер

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

В основном это происходит при быстром перемещении камеры слева направо и назад, но иногда и без каких-либо действий.

Я не нашел никого, кто бы пытался использовать VNDocumentCameraViewControllerс Xamarin Forms. Что я делаю не так? Или есть баг?

1 ответ

Решение

Я нашел решение... Я боролся с этим два дня, и теперь я обнаружил, что сборщик мусора выполнил свою чертову работу и уничтожил мой scannerController через некоторое время / позвонил Dispose() из VNDocumentCameraViewController. Если я изменил его на члена класса, это сработало:

Пользовательский рендерер

[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);
            }
        }
    }
}
Другие вопросы по тегам