RemoveFromSuperview似乎没有删除我创建的子视图

时间:2015-10-20 21:26:51

标签: ios swift qr-code

我正在使用swift代码测试制作QR码扫描仪,我无法在重置时删除红框。

我在viewDidLoad

中有以下代码
// Red box highlight
    qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
    qrCodeFrameView.layer.borderWidth = 2
    viewForLayer.addSubview(qrCodeFrameView)
    viewForLayer.bringSubviewToFront(qrCodeFrameView)
    // End box highlight

现在扫描QR时会显示边框:

let barCodeObject = self.previewLayer?.transformedMetadataObjectForMetadataObject(metadataObject as! AVMetadataMachineReadableCodeObject) as!  AVMetadataMachineReadableCodeObject
        qrCodeFrameView.frame = barCodeObject.bounds

使用重置按钮我想删除边框并能够重新扫描。通过以下我能够重新扫描,但最后一个红色矩形仍然可见

        @IBAction func resetButtonTapped(sender: AnyObject) {
        self.refreshView()
    }

    func refreshView(){
        //remove frame border
        qrCodeFrameView.removeFromSuperview()
        self.viewDidLoad()   
self.viewWillAppear(true)
    }

我在qrCodeFrameView.removeFromSuperview()中添加了一个断点,它在那里停止,但我不知道它们到底在找什么。 (我的意思是变量我得到它但是对于removeFromSuperview我不知道会发生什么?)

问候

[编辑] 好的,我按照提示永远不要直接调用viewDidLoad一个viewDidAppear,我创建了一个单独的函数cameraLayerWithBorder(),但仍然在reset / refreshView上显示红色边框?

 func cameraLayerWithBorder(){
        view.backgroundColor = UIColor.blackColor()
        captureSession = AVCaptureSession()

        let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        let videoInput: AVCaptureDeviceInput

//capture image code .......

        // Previewlayer with camera added to a placed layer 
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
        previewLayer.frame = viewForLayer.bounds;
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        viewForLayer.layer.addSublayer(previewLayer);


        // Red box highlight
        qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
        qrCodeFrameView.layer.borderWidth = 2
        viewForLayer.addSubview(qrCodeFrameView)
        viewForLayer.bringSubviewToFront(qrCodeFrameView)
        // End box highlight

         captureSession.startRunning();
    }

我编辑了refreshView()

        func refreshView(){
        print("reset")
        //remove frame border
        qrCodeFrameView.removeFromSuperview()
       // self.viewDidLoad()
//        self.viewWillAppear(true)
        self.cameraLayerWithBorder()
    }

此函数的一部分设置红色边框

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    captureSession.stopRunning()

    if let metadataObject = metadataObjects.first {//fula says let verwijderen
        let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject;

        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        // add red borders
        let barCodeObject = self.previewLayer?.transformedMetadataObjectForMetadataObject(metadataObject as! AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject
        qrCodeFrameView.frame = barCodeObject.bounds
        // end add red borders
        foundCode(readableObject.stringValue);
    }

    dismissViewControllerAnimated(true, completion: nil)
}

以下是调试中视图的屏幕截图(红色边框是UIWindow> UIView> UIView> UIView

enter image description here

[编辑2] 可行的解决方案,感谢Ibrahim我忽略了显而易见的,我不得不将功能cameraLayerWithBorder的frameborder代码部分添加到captureOutput函数

 // Red box highlight

        qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
        qrCodeFrameView.layer.borderWidth = 2
        viewForLayer.addSubview(qrCodeFrameView)
        viewForLayer.bringSubviewToFront(qrCodeFrameView)
        // End box highlight

仍然不确定这是不是

3 个答案:

答案 0 :(得分:1)

仅从superview中删除不起作用,您还需要删除预览图层。请在下面试试,希望它能运作。

videoPreviewLayer?.removeFromSuperlayer()
view.sendSubview(toBack: self.qrCodeFrameView!)
self.qrCodeFrameView?.removeFromSuperview()
captureSession?.stopRunning()

如果这不起作用,请告诉我。

答案 1 :(得分:0)

在处理UI操作时,您必须使用main queue

目标C

dispatch_async(dispatch_get_main_queue(),^{
    [qrCodeFrameView removeFromSuperview]
 })

夫特

dispatch_async(dispatch_get_main_queue()) {
    qrCodeFrameView.removeFromSuperview()
}

答案 2 :(得分:0)

您可以在resetButtonTapped()中的超级视图中删除该视图,但之后会调用该函数cameraLayerWithBorder()。在该方法中,您再次添加qrCodeFrameView

之后不要再调用cameraLayerWithBorder(),而是在resetButtonTapped()中编写新代码,或者创建一个新方法,并在删除后调用它。

---第一个答案---

尝试删除viewDidLoad()& viewWillAppear(),我认为原因。不是100%肯定。但在这种情况下,您不必调用这些方法,但如果您想调用viewDidLoad,请使用此方法

https://stackoverflow.com/a/9868106/1842694

相关问题