안녕하세요 후르륵짭짭 입니다.
이번에는 QRCode Reader를 만들려고 합니다. (아직은 정확히 어떤 기능을 하는지 잘 모르기 때문에 대충적겠습니다 ㅎㅎ )
QRCode 리더기는 영상으로 읽게 됩니다.
** 시작 **
Info.plist에 가서 아무 + 나 누르고 위와 같이
Privacy - Camera Usage Description
을 추가해준 다음에 viewcontroller로 이동해주세요!
그리고 AVFoundationi 을 임포트 해주세요
import AVFoundation
그러고 나서
let session = AVCaptureSession()
을 만들어 주세요.
AVCaptureSession은 영상을 담고 처리하는 공간입니다.
그리고 ViewDidLoad()에 아래 코드를 적어주세요!
func basicSetting(){
//사물을 video 방식으로 영상을 촬영하겠다!
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
do{
let input = try AVCaptureDeviceInput(device: captureDevice!)
session.addInput(input)
}catch{
print("Error")
}
let output = AVCaptureMetadataOutput()
session.addOutput(output)
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
//영상을 담을 공간을 만들어 준다.
let video = AVCaptureVideoPreviewLayer(session: session)
video.frame = CameraView.layer.bounds
video.videoGravity = AVLayerVideoGravity.resizeAspectFill
CameraView.layer.addSublayer(video)
CameraView.bringSubviewToFront(focusImage)
session.startRunning()
}
하나씩 설명 하도록 하겠습니다.
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
AVCaptureDevice는 어떤 처리 방식으로 캡처할 것이냐??? 를 물어보는 것이기에 저희는 video로 해줍니다.
do{
let input = try AVCaptureDeviceInput(device: captureDevice!)
session.addInput(input)
}catch{
print("Error")
}
그리고 이 코드를 적어주세요.
이 코드는 captureDevice에서 영상으로 촬영을 하면 지속적으로 데이터를 넣어주고, 그것을 위에서 만든 영상을 담고 처리하는 공간인 sessioin에 추가해줍니다.
let output = AVCaptureMetadataOutput()
session.addOutput(output)
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
그리고 나서 session에서 우리가 넣어준 input 결과물을 빼주고 이것을 mainThread에서 처리 해줍니다.
그리고 이 결과물을 QR 코드로 인식 하게 됩니다.
//영상을 담을 공간을 만들어 준다.
let video = AVCaptureVideoPreviewLayer(session: session)
//카메라의 크기 지정
video.frame = CameraView.layer.bounds
//카메라의 비율지정
video.videoGravity = AVLayerVideoGravity.resizeAspectFill
//view에 추가하고
CameraView.layer.addSublayer(video)
//초점 뷰를 cameraview 위에 추가
CameraView.bringSubviewToFront(focusImage)
이렇게 해주면 View에 QRCode 카메라가 나올 것 입니다.
이제 인식을 하게 되면 이 코드가 호출 될 수 있도록 해줍니다.
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count == 0 {
return
}
guard let metaObject = metadataObjects[0] as? AVMetadataMachineReadableCodeObject else {return}
if metaObject.type == AVMetadataObject.ObjectType.qr {
if let outPutValue = metaObject.stringValue{
//http 형의 코드인지 확인
if outPutValue.hasPrefix("http://") || outPutValue.hasPrefix("https://") {
UrlLabel.setTitle(outPutValue, for: .normal)
zoomIn()
//print(url)
session.stopRunning()
}
}
}
}
meatadataObjects 는 인식한 사물의 수 입니다.
guard let metaObject = metadataObjects[0] as? AVMetadataMachineReadableCodeObject else {return}
그리고 그 처음으로 인식한 metadataObject가 AVMeatadataMachineRead 할 수 있는지 확인 해줍니다.
if metaObject.type == AVMetadataObject.ObjectType.qr {
if let outPutValue = metaObject.stringValue{
if outPutValue.hasPrefix("http://") || outPutValue.hasPrefix("https://") {
UrlLabel.setTitle(outPutValue, for: .normal)
zoomIn()
//카메라 인식 종류
session.stopRunning()
}
}
}
그리고 인식한 것이 qr 코드인지 확인 해주면 됩니다!!
참 쉽죠??
사실 거의 코드 복붙해주시면 됩니다!!
모두모두 즐코코코 하세요!!!
** 참고 사이트 **
levelup.gitconnected.com/how-to-create-a-qrcode-reader-in-swift-1b633d5ac95e
www.youtube.com/watch?v=4Zf9dHDJ2yU
'Xcode > IOS' 카테고리의 다른 글
IOS) URL을 통해 이미지 뷰 가져오기 (0) | 2020.07.22 |
---|---|
IOS) WebKit View를 이용하기 (0) | 2020.07.16 |
IOS) Custom KeyBoard 다루기 (0) | 2020.07.14 |
IOS) User Interaction 에 대해서 알아보자 (0) | 2020.07.13 |
IOS) UIViewController로 Pop UP 만들기 (0) | 2020.07.13 |
댓글