我正在使用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
[编辑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
仍然不确定这是不是
答案 0 :(得分:1)
仅从superview中删除不起作用,您还需要删除预览图层。请在下面试试,希望它能运作。
videoPreviewLayer?.removeFromSuperlayer()
view.sendSubview(toBack: self.qrCodeFrameView!)
self.qrCodeFrameView?.removeFromSuperview()
captureSession?.stopRunning()
如果这不起作用,请告诉我。
答案 1 :(得分:0)
在处理UI操作时,您必须使用main queue
:
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
,请使用此方法