我正在嘗試使用來自 hackingswift.com 的 Swift 類來讀取 QR 碼。該代碼過去顯然已被該論壇的發布者使用,但現在在 Swift 5.5 中不起作用。我在行上收到錯誤“運算式無法決議,未知錯誤”
view.layer.addSublayer(previewLayer)
在下面的。任何幫助,將不勝感激。
//: A UIKit based Playground for presenting user interface
import AVFoundation
import UIKit
import PlaygroundSupport
class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var captureSession: AVCaptureSession!
var previewLayer: AVCaptureVideoPreviewLayer!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.black
captureSession = AVCaptureSession()
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
let videoInput: AVCaptureDeviceInput
do {
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
} catch {
return
}
if (captureSession.canAddInput(videoInput)) {
captureSession.addInput(videoInput)
} else {
failed()
return
}
let metadataOutput = AVCaptureMetadataOutput()
if (captureSession.canAddOutput(metadataOutput)) {
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
metadataOutput.metadataObjectTypes = [.qr]
} else {
failed()
return
}
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.frame = view.layer.bounds
previewLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(previewLayer)
captureSession.startRunning()
}
func failed() {
let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
captureSession = nil
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if (captureSession?.isRunning == false) {
captureSession.startRunning()
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if (captureSession?.isRunning == true) {
captureSession.stopRunning()
}
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
captureSession.stopRunning()
if let metadataObject = metadataObjects.first {
guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
guard let stringValue = readableObject.stringValue else { return }
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
found(code: stringValue)
}
dismiss(animated: true)
}
func found(code: String) {
print(code)
}
override var prefersStatusBarHidden: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = ScannerViewController()
uj5u.com熱心網友回復:
.addSublayer 正在按預期作業。
您可以在 Playground 中試用下面的示例代碼進行測驗。
let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
view.backgroundColor = .cyan
let layer = CALayer()
layer.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
layer.position = CGPoint(x: 200/2, y: 200/2)
layer.backgroundColor = UIColor.magenta.cgColor
layer.borderWidth = 5
layer.borderColor = UIColor.black.cgColor
view.layer.addSublayer(layer)
PlaygroundPage.current.liveView = view
我迅速嘗試了您在 Playgrounds 中提供的示例代碼,但AVCaptureDevice.default(for: .video)似乎失敗了。
uj5u.com熱心網友回復:
這是游樂場中的一個煩人的錯誤。暫且不說游樂場或模擬器中沒有可用的捕獲設備,因此無論如何這些都不起作用,解決方法是將view其視為可選:
view?.layer.addSublayer(previewLayer)
我不知道為什么會這樣,其他人也不知道
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/421118.html
標籤:
