簡體   English   中英

RemoveFromSuperview 似乎沒有刪除我創建的子視圖

[英]RemoveFromSuperview doesn't seemed to remove the subview i created

我正在使用 swift 代碼進行測試以制作二維碼掃描儀,但我無法在重置時移除紅框。

我在 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

在此處輸入圖片說明

[編輯 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

仍然不確定這是不是這樣

僅從超級視圖中刪除不起作用,您還需要刪除預覽層。 請在下面嘗試,希望它會起作用。

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

如果這不起作用,請告訴我。

處理 UI 操作時必須使用main queue

目標 C

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

迅速

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

您在resetButtonTapped()resetButtonTapped()視圖中刪除視圖,但隨后您調用函數cameraLayerWithBorder() 在該方法中,您再次添加qrCodeFrameView

之后不要調用cameraLayerWithBorder() ,而是用你想要在resetButtonTapped()做的事情編寫新代碼或創建一個新方法並在刪除它后調用它。

--- 第一個答案 ---

嘗試刪除viewDidLoad()viewWillAppear() ,我認為這是原因。 不是 100% 確定。 但在這種情況下,您不必調用這些方法,但如果您想調用viewDidLoad使用此方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM