iOS實(shí)現(xiàn)“搖一搖”與“掃一掃”功能示例代碼
“搖一搖”功能的實(shí)現(xiàn):
iPhone對 “搖一搖”有很好的支持,總體說來就兩步:
在視圖控制器中打開接受“搖一搖”的開關(guān);
- (void)viewDidLoad {
// 設(shè)置允許搖一搖功能
[UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
// 并讓自己成為第一響應(yīng)者
[self becomeFirstResponder];
}
在“搖一搖”觸發(fā)的制定的方法中實(shí)現(xiàn)需要實(shí)現(xiàn)的功能(”搖一搖“檢測方法)。
// 搖一搖開始搖動(dòng)
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
NSLog(@"開始搖動(dòng)");
//添加“搖一搖”動(dòng)畫
[self addAnimations];
//音效
AudioServicesPlaySystemSound (soundID);
return;
}
// “搖一搖”取消搖動(dòng)
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
NSLog(@"取消搖動(dòng)");
return;
}
// “搖一搖”搖動(dòng)結(jié)束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if (event.subtype == UIEventSubtypeMotionShake) { // 判斷是否是搖動(dòng)結(jié)束
NSLog(@"搖動(dòng)結(jié)束");
}
return;
}
”搖一搖“的動(dòng)畫效果:
- (void)addAnimations {
//音效
AudioServicesPlaySystemSound (soundID);
//讓上面圖片的上下移動(dòng)
CABasicAnimation *translation2 = [CABasicAnimation animationWithKeyPath:@"position"];
translation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
translation2.fromValue = [NSValue valueWithCGPoint:CGPointMake(160, 115)];
translation2.toValue = [NSValue valueWithCGPoint:CGPointMake(160, 40)];
translation2.duration = 0.4;
translation2.repeatCount = 1;
translation2.autoreverses = YES;
//讓下面的圖片上下移動(dòng)
CABasicAnimation *translation = [CABasicAnimation animationWithKeyPath:@"position"];
translation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
translation.fromValue = [NSValue valueWithCGPoint:CGPointMake(160, 345)];
translation.toValue = [NSValue valueWithCGPoint:CGPointMake(160, 420)];
translation.duration = 0.4;
translation.repeatCount = 1;
translation.autoreverses = YES;
[imgDown.layer addAnimation:translation forKey:@"translation"];
[imgUp.layer addAnimation:translation2 forKey:@"translation2"];
}
注意:在模擬器中運(yùn)行時(shí),可以通過「Hardware」-「Shake Gesture」來測試「搖一搖」功能。如下:

“掃一掃”功能的實(shí)現(xiàn):
基于AVCaptureDevice做的二維碼掃描器,基本步驟如下:
初始化相機(jī),生成掃描器
設(shè)置參數(shù)
- (void)setupCamera {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
_input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:nil];
_output = [[AVCaptureMetadataOutput alloc]init];
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
_session = [[AVCaptureSession alloc]init];
[_session setSessionPreset:AVCaptureSessionPresetHigh];
if ([_session canAddInput:self.input])
{
[_session addInput:self.input];
}
if ([_session canAddOutput:self.output])
{
[_session addOutput:self.output];
}
// 條碼類型 AVMetadataObjectTypeQRCode
_output.metadataObjectTypes = [NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode, nil];
dispatch_async(dispatch_get_main_queue(), ^{
//更新界面
_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
_preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
_preview.frame = CGRectMake(0, 0, CGRectGetWidth(self.centerView.frame), CGRectGetHeight(self.centerView.frame));
[self.centerView.layer insertSublayer:self.preview atIndex:0];
[_session startRunning];
});
});
}
在viewWillAppear和viewWillDisappear里對session做優(yōu)化(timer是個(gè)掃描動(dòng)畫的計(jì)時(shí)器)
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (_session && ![_session isRunning]) {
[_session startRunning];
}
timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(scanningAnimation) userInfo:nil repeats:YES];
[self setupCamera];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
_count = 0;
[timer invalidate];
[self stopReading];
}
處理掃描結(jié)果
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
NSString *stringValue;
if ([metadataObjects count] >0){
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
stringValue = metadataObject.stringValue;
NSLog(@"%@",stringValue);
}
[_session stopRunning];
[timer invalidate];
_count ++ ;
[self stopReading];
if (stringValue && _count == 1) {
//掃描完成
}
}
用二維碼掃描器掃描自己的二維碼:
NSString *url = [NSURL URLWithString:@"html/judgement.html" relativeToURL:[ZXApiClient sharedClient].baseURL].absoluteString;
if ([stringValue hasPrefix:url]) {
//如果掃出來的url是自己的域名開頭的,那么做如下的處理
}
最后附上自己完整的源碼:
// Created by Ydw on 16/3/15.
// Copyright © 2016年 IZHUO.NET. All rights reserved.
//
import “ViewController.h”
import <AVFoundation/AVFoundation.h>
@interface ViewController ()
{
int number;
NSTimer *timer;
NSInteger _count;
BOOL upOrdown;
AVCaptureDevice *lightDevice;
}
@property (nonatomic,strong) UIView *centerView;//掃描的顯示視圖
/**
* 二維碼掃描參數(shù)
*/
@property (strong,nonatomic) AVCaptureDevice *device;
@property (strong,nonatomic) AVCaptureDeviceInput *input;
@property (strong,nonatomic) AVCaptureMetadataOutput *output;
@property (strong,nonatomic) AVCaptureSession *session;
@property (strong,nonatomic) AVCaptureVideoPreviewLayer *preview;
@property (nonatomic,retain) UIImageView *imageView;//掃描線
(void)setupCamera;
(void)stopReading;
@end
@implementation ViewController
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (_session && ![_session isRunning]) {
[_session startRunning];
}
timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(scanningAnimation) userInfo:nil repeats:YES];
[self setupCamera];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor clearColor];
self.automaticallyAdjustsScrollViewInsets = NO;
_count = 0 ;
//初始化閃光燈設(shè)備
lightDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//掃描范圍
_centerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame))];
_centerView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_centerView];
//掃描的視圖加載
UIView *scanningViewOne = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 120)];
scanningViewOne.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4];
[self.centerView addSubview:scanningViewOne];
UIView *scanningViewTwo = [[UIView alloc]initWithFrame:CGRectMake(0, 120, (self.view.frame.size.width-300)/2, 300)];
scanningViewTwo.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4];
[self.centerView addSubview:scanningViewTwo];
UIView *scanningViewThree = [[UIView alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2+150, 120, (self.view.frame.size.width-300)/2, 300)];
scanningViewThree.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4];
[self.centerView addSubview:scanningViewThree];
UIView *scanningViewFour = [[UIView alloc]initWithFrame:CGRectMake(0, 420, self.view.frame.size.width,CGRectGetHeight(self.view.frame)- 420)];
scanningViewFour.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4];
[self.centerView addSubview:scanningViewFour];
UILabel *labIntroudction= [[UILabel alloc] initWithFrame:CGRectMake(15, 430, self.view.frame.size.width - 30, 30)];
labIntroudction.backgroundColor = [UIColor clearColor];
labIntroudction.textAlignment = NSTextAlignmentCenter;
labIntroudction.textColor = [UIColor whiteColor];
labIntroudction.text = @"請將企業(yè)邀請碼放入掃描框內(nèi)";
[self.centerView addSubview:labIntroudction];
UIButton *openLight = [[UIButton alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2-25, 470, 50, 50)];
[openLight setImage:[UIImage imageNamed:@"燈泡"] forState:UIControlStateNormal];
[openLight setImage:[UIImage imageNamed:@"燈泡2"] forState:UIControlStateSelected];
[openLight addTarget:self action:@selector(openLightWay:) forControlEvents:UIControlEventTouchUpInside];
[self.centerView addSubview:openLight];
//掃描線
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2-110, 130, 220, 5)];
_imageView.image = [UIImage imageNamed:@"scanning@3x"];
[self.centerView addSubview:_imageView];
}
- (void)viewWillDisappear:(BOOL)animated {
_count= 0;
[timer invalidate];
[self stopReading];
}
pragma mark -- 設(shè)置參數(shù)
- (void)setupCamera {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
_input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:nil];
_output = [[AVCaptureMetadataOutput alloc]init];
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
_session = [[AVCaptureSession alloc]init];
[_session setSessionPreset:AVCaptureSessionPresetHigh];
if ([_session canAddInput:self.input])
{
[_session addInput:self.input];
}
if ([_session canAddOutput:self.output])
{
[_session addOutput:self.output];
}
// 條碼類型 AVMetadataObjectTypeQRCode
_output.metadataObjectTypes = [NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode, nil];
dispatch_async(dispatch_get_main_queue(), ^{
//更新界面
_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
_preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
_preview.frame = CGRectMake(0, 0, CGRectGetWidth(self.centerView.frame), CGRectGetHeight(self.centerView.frame));
[self.centerView.layer insertSublayer:self.preview atIndex:0];
[_session startRunning];
});
});
}
//掃描動(dòng)畫
- (void)scanningAnimation {
if (upOrdown == NO) {
number ++;
_imageView.frame = CGRectMake(CGRectGetWidth(self.view.frame)/2-115, 130+2*number, 230, 5);
if (2*number == 280) {
upOrdown = YES;
}
}
else {
number --;
_imageView.frame = CGRectMake(CGRectGetWidth(self.view.frame)/2-115, 130+2*number, 230, 5);
if (number == 0) {
upOrdown = NO;
}
}
}
- (void)stopReading {
[_session stopRunning];
_session = nil;
[_preview removeFromSuperlayer];
[timer invalidate];
timer = nil ;
}
-(void)openLightWay:(UIButton *)sender {
if (![lightDevice hasTorch]) {//判斷是否有閃光燈
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"當(dāng)前設(shè)備沒有閃光燈,不能提供手電筒功能" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:sureAction];
[self presentViewController:alert animated:YES completion:nil];
return;
}
sender.selected = !sender.selected;
if (sender.selected == YES) {
[lightDevice lockForConfiguration:nil];
[lightDevice setTorchMode:AVCaptureTorchModeOn];
[lightDevice unlockForConfiguration];
}
else
{
[lightDevice lockForConfiguration:nil];
[lightDevice setTorchMode: AVCaptureTorchModeOff];
[lightDevice unlockForConfiguration];
}
}
pragma mark -- AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
NSString *stringValue;
if ([metadataObjects count] >0){
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
stringValue = metadataObject.stringValue;
NSLog(@"%@",stringValue);
}
[_session stopRunning];
[timer invalidate];
_count ++ ;
[self stopReading];
if (stringValue && _count == 1) {
//掃描完成
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IOS實(shí)現(xiàn)視頻動(dòng)畫效果的啟動(dòng)圖
這篇文章實(shí)現(xiàn)的是一個(gè)關(guān)于啟動(dòng)頁或者引導(dǎo)頁的視頻動(dòng)畫效果的實(shí)現(xiàn)過程,對于大家開發(fā)APP具有一定的參考借鑒價(jià)值,有需要的可以來看看。2016-09-09
iOS中的音頻服務(wù)和音頻AVAudioPlayer音頻播放器使用指南
這里我們要介紹的是AVAudio ToolBox框架中的AudioServicesPlaySystemSound函數(shù)創(chuàng)建的服務(wù),特別適合用來制作鈴聲,下面就簡單整理一下iOS中的音頻服務(wù)和音頻AVAudioPlayer音頻播放器使用指南:2016-06-06
iOS 檢測網(wǎng)絡(luò)狀態(tài)的兩種方法
一般有Reachability和AFNetworking監(jiān)測兩種方式,都是第三方的框架,下文逐一詳細(xì)給大家講解,感興趣的朋友一起看看吧2016-10-10

