import
UIKit
AVFoundation
class
ViewController
:
UIViewController
AVCaptureMetadataOutputObjectsDelegate
UIAlertViewDelegate
{
var
scanRectView:
UIView
!
device:
AVCaptureDevice
!
input:
AVCaptureDeviceInput
!
output:
AVCaptureMetadataOutput
!
session:
AVCaptureSession
!
preview:
AVCaptureVideoPreviewLayer
!
override
func
viewDidLoad() {
super
.viewDidLoad()
}
@IBAction
fromCamera(sender:
AnyObject
) {
do{
self
.device =
AVCaptureDevice
.defaultDeviceWithMediaType(
AVMediaTypeVideo
)
.input = try
(device: device)
.output =
AVCaptureMetadataOutput
()
output.setMetadataObjectsDelegate(
.session =
()
if
UIScreen
.mainScreen().bounds.size.height<500 {
.session.sessionPreset =
AVCaptureSessionPreset640x480
}
else
{
AVCaptureSessionPresetHigh
}
.session.addInput(
.input)
.session.addOutput(
.output)
.output.metadataObjectTypes = [
AVMetadataObjectTypeQRCode
]
//计算中间可探测区域
let
windowSize:
CGSize
=
.mainScreen().bounds.size;
scanSize:
CGSizeMake
(windowSize.width*3/4,
windowSize.width*3/4);
scanRect:
CGRect
=
CGRectMake
((windowSize.width-scanSize.width)/2,
(windowSize.height-scanSize.height)/2,scanSize.width,scanSize.height);
//计算rectOfInterest 注意x,y交换位置
scanRect =
(scanRect.origin.y/windowSize.height,
scanRect.origin.x/windowSize.width,
scanRect.size.height/windowSize.height,
scanRect.size.width/windowSize.width);
//设置可探测区域
.output.rectOfInterest = scanRect
.preview =
AVCaptureVideoPreviewLayer
(session:
.session)
.preview.videoGravity =
AVLayerVideoGravityResizeAspectFill
.preview.frame =
.mainScreen().bounds
.view.layer.insertSublayer(
.preview,atIndex:0)
//添加中间的探测区域绿框
.scanRectView =
UIView
();
.view.addSubview(
.scanRectView)
.scanRectView.frame =
CGRectMake
(0,scanSize.height);
.scanRectView.center =
CGPointMake
(
CGRectGetMidX
(
UIScreen
.mainScreen().bounds),
CGRectGetMidY
.mainScreen().bounds));
.scanRectView.layer.borderColor =
UIColor
.greenColor().
CGColor
.scanRectView.layer.borderWidth = 1;
//开始捕获
.session.startRunning()
}catch _
as
NSError
{
//打印错误消息
errorAlert =
UIAlertView
(title:
"提醒"
message:
"请在iPhone的"设置-隐私-相机"选项中,允许本程序访问您的相机"
delegate:
cancelButtonTitle:
"确定"
)
errorAlert.show()
}
}
//摄像头捕获
captureOutput(captureOutput:
AVCaptureOutput
!,
didOutputMetadataObjects metadataObjects: [
AnyObject
]!,
fromConnection connection:
AVCaptureConnection
!) {
stringValue:
String
?
if
metadataObjects.count > 0 {
metadataObject = metadataObjects[0]
as
!
AVMetadataMachineReadableCodeObject
stringValue = metadataObject.stringValue
stringValue !=
nil
{
.session.stopRunning()
}
}
.session.stopRunning()
//输出结果
alertView =
UIAlertView
"二维码"
)
alertView.show()
}
//消息框确认后消失
alertView(alertView:
Int
) {
//继续扫描
.session.startRunning()
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
}