[英]Why doesn't removeFromSuperview() collapse a tableview's subview?
[英]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
:
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
使用此方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.