Ios RemoveFromSuperview不';t似乎删除了我创建的子视图
我正在使用swift代码进行测试,以制作二维码扫描仪,重置时无法移除红色边框 我在viewDidLoad中有以下代码Ios RemoveFromSuperview不';t似乎删除了我创建的子视图,ios,swift,qr-code,Ios,Swift,Qr Code,我正在使用swift代码进行测试,以制作二维码扫描仪,重置时无法移除红色边框 我在viewDidLoad中有以下代码 // Red box highlight qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor qrCodeFrameView.layer.borderWidth = 2 viewForLayer.addSubview(qrCodeFrameView) viewForLayer
// 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,我不知道会发生什么??)
问候
[编辑]
好的,我按照提示从不调用ViewDid加载ViewDid直接显示,我创建了一个单独的函数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 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添加到captureOutput函数
// Red box highlight
qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
qrCodeFrameView.layer.borderWidth = 2
viewForLayer.addSubview(qrCodeFrameView)
viewForLayer.bringSubviewToFront(qrCodeFrameView)
// End box highlight
仍然不确定这是否是处理UI操作时必须使用的方法
主队列
:
目标C
敏捷的
在
resetButtonTapped()
中将视图从其超级视图中删除,但随后调用函数cameraLayerWithBorder()
。在该方法中,再次添加qrCodeFrameView
以后不要调用cameraLayerWithBorder()
,而是使用resetButtonTapped()
中要执行的操作编写新代码,或者创建一个新方法并在删除后调用它
--第一个答案--
尝试删除viewDidLoad()
&viewDidLoad()
,我想这就是原因。不是100%确定。但是在这种情况下,您不必调用这些方法,但是如果您想调用viewDidLoad
,请使用这种方法
仅从superview中删除将不起作用,您还需要删除预览层。请尝试下面的操作,希望它能起作用
videoPreviewLayer?.removeFromSuperlayer()
view.sendSubview(toBack: self.qrCodeFrameView!)
self.qrCodeFrameView?.removeFromSuperview()
captureSession?.stopRunning()
如果这不起作用,请告诉我。永远不要调用
viewDidLoad
或viewwillbeen
yourself.tx,我已经对这两个函数进行了注释,并使用viewDidLoad()中最初的代码添加了一个函数这是不需要的。所有这些都已经在主线程上完成了。答案是正确的,如果您正在处理服务器请求,您必须在主队列中执行此操作。SWIFT 4 DispatchQueue.main.async{self.XXX.removeFromSuperview()}hi Ibrahim,我已经用代码添加了函数(请参见我的编辑)但是边界还是显示出来了,但是cameraLayerWithBorder()有我喜欢执行的代码。将其视为一种初始状态,扫描代码后,我喜欢返回到第一种状态,因此我认为我可以重用代码。但我明白你的意思。嗯,因此你仍然希望在单击重置时显示qrCodeFrameView
,但不显示红色边框?你能更轻松一些吗具体的
dispatch_async(dispatch_get_main_queue(),^{
[qrCodeFrameView removeFromSuperview]
})
dispatch_async(dispatch_get_main_queue()) {
qrCodeFrameView.removeFromSuperview()
}
videoPreviewLayer?.removeFromSuperlayer()
view.sendSubview(toBack: self.qrCodeFrameView!)
self.qrCodeFrameView?.removeFromSuperview()
captureSession?.stopRunning()