屏幕截图返回为黑色图像 xamarin.ios

问题描述

我正在使用 Zxing 库来生成条形码。我正在尝试捕获该条形码以存储以备将来参考。

我创建了自定义条形码视图。并为 iOS 和 Android 实现了渲染器。但在 iOS 中,图像是黑色的。我从互联网上尝试了很多代码,但都没有成功。

你能告诉我这段代码有什么问题吗?

自定义条码视图

public class BarcodeView : StackLayout
{
    public EventHandler OnDrawBitmap;

    public static readonly BindableProperty BarcodeUrlProperty = BindableProperty.Create(nameof(BarcodeUrl),typeof(string),default(string));

    public string BarcodeUrl
    {
        get { return (string)GetValue(BarcodeUrlProperty); }
        set { SetValue(BarcodeUrlProperty,value); }
    }

}

Xaml 实现

<custom:BarcodeView Opacity="0" x:Name="barcodeview"><!---->                             
        <zxing:ZXingBarcodeImageView  x:Name="QRCodeView" BarcodeFormat="CODE_93"
                HeightRequest="50" WidthRequest="800" BarcodeValue="{Binding RandomBarcodeNumber}"  VerticalOptions="Center">
               <zxing:ZXingBarcodeImageView.BarcodeOptions>
                    <zxcm:EncodingOptions Width="800" Height="200"/>
               </zxing:ZXingBarcodeImageView.BarcodeOptions>
          </zxing:ZXingBarcodeImageView>                             
</custom:BarcodeView>

iOS 渲染器

public class BarcodeVieWrenderer : VieWrenderer<BarcodeView,UIView>
{
    public BarcodeVieWrenderer()
    {
    }

    BarcodeView view;
    protected override void OnElementChanged(ElementChangedEventArgs<BarcodeView> e)
    {
        base.OnElementChanged(e);
        if (e.NewElement != null)
        {
            //register the event
            e.NewElement.OnDrawBitmap += NewElement_OnDrawBitmap;
        }
    }

    private void NewElement_OnDrawBitmap(object sender,EventArgs e)
    {
        try
        {               
            var formsView = Element;
            var rect = new CGRect(formsView.Bounds.X,formsView.Bounds.Y,formsView.Bounds.Width,formsView.Bounds.Height);
            var iOSView = ConvertFormsToNative(formsView,rect);
            UIImage image = ConvertViewToImage(iOSView);

            if (image != null)
                formsView.BarcodeUrl = image.AsPNG().GetBase64EncodedString(Foundation.NSDataBase64EncodingOptions.EndLineWithLineFeed);
            UIGraphics.EndImageContext();
        }
        catch (Exception ex)
        {
        }
    }

    private UIImage ConvertViewToImage(UIView iOSView)
    {
        try
        {
            UIGraphics.BeginImageContextWithOptions(iOSView.Bounds.Size,true,0);
            iOSView.DrawViewHierarchy(iOSView.Bounds,true);
            var context = UIGraphics.GetCurrentContext();
            iOSView.Layer.RenderInContext(context);
            var img = UIGraphics.GetimageFromCurrentimageContext();

            return img;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

    public static UIView ConvertFormsToNative(Xamarin.Forms.View view,CGRect size)
    {
        var renderer = Platform.CreateRenderer(view);

        renderer.NativeView.Frame = size;
        renderer.NativeView.AutoresizingMask = UIViewAutoresizing.All;
        renderer.NativeView.ContentMode = UIViewContentMode.ScaletoFill;
        renderer.Element.Layout(size.ToRectangle());
        var nativeView = renderer.NativeView;
        nativeView.SetNeedsLayout();

        return nativeView;
    }
}

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)