2017-03-22 2 views
0

Ich möchte einen Barcode scannen und das Ergebnis zurückgeben. Ich benutze ZXing dafür. Bei Zxing würde das Standard-Overlay zu einer neuen Seite navigieren und der Scan funktioniert perfekt. Ich möchte auf der gleichen Seite bleiben und möchte eine Unteransicht, um die Kamera zu aktivieren und den Scanvorgang zu starten. Kann jemand raten, wie man das macht?Wie man Zebra Xing (Zxing) Zoll Overlay als Unteransicht in Xamarin iOS

MyCode:

MobileBarcodeScanner scanner; 
    CustomOverlayView customOverlay; 
    ZXingScannerView scannerView; 
    UIActivityIndicatorView loadingView; 
    UIView loadingBg; 
    public event Action<ZXing.Result> OnScannedResult; 
    public MobileBarcodeScanningOptions ScanningOptions { get; set; } 

    public override void ViewDidLoad() 
    { 
     camView = new UIView(new CGRect(0, 0, this.View.Frame.Width, this.View.Frame.Height/4)) { BackgroundColor = UIColor.Clear }; 
     scanner = new MobileBarcodeScanner(); 

     Root = new RootElement("ZXingDwatNet.Mobile") { 
      new Section { 


       camView 
      } 
     }; 


     scannerView = new ZXingScannerView(); 

     camView = scannerView; 
     loadingBg = camView;// new UIView(this.View.Frame) { BackgroundColor = UIColor.Purple, AutoresizingMask = UIViewAutoresizing.FlexibleDimensions }; 
     loadingView = new UIActivityIndicatorView(UIActivityIndicatorViewStyle.Gray) 
     { 
      AutoresizingMask = UIViewAutoresizing.FlexibleMargins 
     }; 
     loadingView.Frame = new CGRect((this.View.Frame.Width - loadingView.Frame.Width)/4, 
      (this.View.Frame.Height - loadingView.Frame.Height)/4, 
      loadingView.Frame.Width/4, 
      loadingView.Frame.Height/4); 

     loadingBg.AddSubview(loadingView); 
     View.AddSubview(loadingBg); 
     loadingView.StartAnimating(); 

     this.View.InsertSubviewBelow(scannerView, loadingView); 

     this.View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; 

     scanner.UseCustomOverlay = true; 
     scanner.CustomOverlay = camView; 
     var options = new MobileBarcodeScanningOptions 
     { 
      AutoRotate = false, 
      TryHarder = true 
     }; 
     Task.Run(async() => 
     { 
      var result = await scanner.Scan(options, false); 
      HandleScanResult(result); 
     }); 


    } 

    void HandleScanResult(ZXing.Result result) 
    { 
     string msg = ""; 

     if (result != null && !string.IsNullOrEmpty(result.Text)) 
      msg = "Found Barcode: " + result.Text; 
     else 
      msg = "Scanning Canceled!"; 

     this.InvokeOnMainThread(() => 
     { 
      var av = new UIAlertView("Barcode Result", msg, null, "OK", null); 
      av.Show(); 
     }); 
    } 

    public override void ViewDidAppear(bool animated) 
    { 
     scannerView.OnScannerSetupComplete += HandleOnScannerSetupComplete; 
     camView = scannerView; 
     //originalStatusBarStyle = UIApplication.SharedApplication.StatusBarStyle; 
     var opt = new MobileBarcodeScanningOptions(); 
     opt.DelayBetweenContinuousScans = 3000; 
     ScanningOptions = opt; 

     if (UIDevice.CurrentDevice.CheckSystemVersion(7, 0)) 
     { 
      UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.Default; 
      SetNeedsStatusBarAppearanceUpdate(); 
     } 
     else 
      UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.BlackTranslucent, false); 

     Console.WriteLine("Starting to scan..."); 

     Task.Factory.StartNew(() => 
     { 
      BeginInvokeOnMainThread(() => scannerView.StartScanning(result => 
      { 

       //if (!ContinuousScanning) 
       //{ 
        // Console.WriteLine("Stopping scan..."); 
        // scannerView.StopScanning(); 
       //} 

       var evt = this.OnScannedResult; 
       if (evt != null) 
        evt(result); 

      }, this.ScanningOptions)); 
     }); 
    } 

    void HandleOnScannerSetupComplete() 
    { 
     BeginInvokeOnMainThread(() => 
     { 
      if (loadingView != null && loadingBg != null && loadingView.IsAnimating) 
      { 
       loadingView.StopAnimating(); 

       UIView.BeginAnimations("zoomout"); 

       UIView.SetAnimationDuration(2.0f); 
       UIView.SetAnimationCurve(UIViewAnimationCurve.EaseOut); 

       loadingBg.Transform = CGAffineTransform.MakeScale(2.0f, 2.0f); 
       loadingBg.Alpha = 0.0f; 

       UIView.CommitAnimations(); 


       loadingBg.RemoveFromSuperview(); 
      } 
     }); 
    } 
+0

verwenden Sie möchten die Kamera in Ihrem '' 'ScanView''' starten? –

+0

Ja, das von Zxing, das nach Barcode sucht. – TheDeveloper

Antwort

2

Sie haben ZXingScannerView zu verwenden und es zu Ihrer Ansicht hinzuzufügen. Sie können sehen, wie man ZXingScannerView in ZXingScannerViewController

+0

Können Sie ein kleines Beispiel David geben? Ich habe es versucht, aber es hat nicht wie erwartet funktioniert. – TheDeveloper

+0

Ich habe meine Frage mit dem Code aktualisiert, können Sie sehen, was ich vermisse. – TheDeveloper

+0

Sie müssen mit dem Scannen beginnen: https://github.com/Redth/ZXing.Net.Mobile/blob/master/Source/ZXing.Net.Mobile.iOS/ZXingScannerViewController.cs#L143 –

Verwandte Themen