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