VNDocumentCameraViewController trong Xamarin Forms bị đóng băng

Sep 19 2020

Tôi muốn sử dụng tính năng mới VNDocumentCameraViewControllertừ iOS 13 trong Ứng dụng Xamarin Forms của mình với trình kết xuất tùy chỉnh. Nó hoạt động, nhưng đôi khi sau một vài giây, bản xem trước từ máy ảnh bị đóng băng và tôi không có cơ hội thực hiện bất kỳ điều gì trên bộ điều khiển chế độ xem.

Để tạo lại lỗi, tôi đã giảm mã của mình thành như sau:

Theo cách nhìn thông thường:

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>

Trình kết xuất tùy chỉnh

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

Nó chủ yếu xảy ra khi di chuyển máy ảnh nhanh từ trái sang phải và ngược lại, nhưng đôi khi cũng không làm gì cả.

Tôi không tìm thấy bất kỳ ai cố gắng sử dụng VNDocumentCameraViewControllervới Xamarin Forms. Tôi đang làm gì sai? Hoặc là có một lỗi?

Trả lời

2 StephanEngelhardt Sep 18 2020 at 22:33

Tôi đã tìm ra giải pháp ... Tôi đã đấu tranh hai ngày với nó và bây giờ tôi phát hiện ra rằng người thu gom rác đã làm công việc tồi tệ của mình và phá hủy của tôi scannerControllersau một thời gian / cuộc gọi Dispose()của VNDocumentCameraViewController. Nếu tôi thay đổi nó thành một thành viên trong lớp, nó đã hoạt động:

Trình kết xuất tùy chỉnh

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