【发布时间】:2015-10-20 21:26:50
【问题描述】:
我正在使用 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)
}
这里是debug中的视图截图(红色边框是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
还是不知道是不是这样
【问题讨论】:
-
永远不要自己打电话给
viewDidLoad或viewWillAppear。 -
tx,我已经将两者都注释掉了,并使用我最初在 viewDidLoad() 中的代码添加了一个函数