iOS 技术点总结

之前在工作中遇到一些技术上的问题,经过几番查找才得以解决,浪费了不少时间开发中很影响项目进度,最近因为换工作才有时间在这里做一个整理,方便以后的查看,同时分享给大家有这些问题的朋友可以少走弯路;

一, 时间格式的转换

有时候我们想将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理;

//实例化一个NSDateFormatter对象

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

>>>输出格式为:2010-10-27 10:22:13

//设定时间格式,这里可以设置成自己需要的格式

//用[NSDate date]可以获取系统当前时间

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

NSLog(@"%@",currentDateStr);

>>>输出格式为:2010年10月27日 10时22分13;

[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH时mm分ss"];

NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

>>>输出格式为:2010年10月27日;

[dateFormatter setDateFormat:@"yyyy年MM月dd日"];

NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

如果是后台返回的字符串格式,要先将字符串转换为 Data 格式

"h" 12 小时制将小时显示为不带前导零的数字, "hh" 带前导零的数字;

"H" 24 小时制将小时显示为不带前导零的数字,"HH" 带前导零的数字

1, 根据已有日期创建日期 addTimeInterval:

NSDate *now = [NSDate date];

NSTimeInterval secondsPerDay1 = 24*60*60;

NSDate *yesterDay = [now addTimeInterval:-secondsPerDay1];

2, 比较日期

isEqualToDate: (返回 BOOL)

3, 获取较早的日期

NSDate *earlierDate = [yesterDay earlierDate:now];

4, 较晚的日期

NSDate *laterDate = [yesterDay laterDate:now];

//两个日期之间相隔多少秒

NSTimeInterval secondsBetweenDates= [yesterDay timeIntervalSinceDate:now];

详情可查看: http://www.cnblogs.com/Cristen/p/3599922.html

http://blog.csdn.net/l_ch_g/article/details/8217725

二维码扫描的封装


1 , 设置输入输出设备

- (void)initUI:(CGRect)previewFrame

{

首先要判断摄像头是否能用

//初始化设备为视频设备

self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

NSError *error = nil;

//初始化输入设备是摄像头视频设备

self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:&error];

//如果没有摄像头 或者摄像头不可用就调用代理方法传出出错信息

if (error) {

if ([self.delegate respondsToSelector:@selector(qrCodeError:)]) {

[self.delegate qrCodeError:error];

}

NSLog(@"你手机不支持二维码扫描!");

return;

}

可以正常使用初始化输出设备

self.output = [[AVCaptureMetadataOutput alloc]init];

//设置输出设备的代理 是当前控制器  并且设置队列为主队列

[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

初始化会话

self.session = [[AVCaptureSession alloc]init];

//判断输入设备和输出设备能否被添加到会话中

if ([self.session canAddInput:self.input])

{

[self.session addInput:self.input];

}

if ([self.session canAddOutput:self.output])

{

[self.session addOutput:self.output];

}

//设置输出设备的类型支持

self.output.metadataObjectTypes = @[ AVMetadataObjectTypeQRCode];

//用会话初始化一个能拍照扫描的layer

self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];

self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

//设置layer的frame为大视图的frame

self.preview.frame = previewFrame;

//把拍摄的layer添加到主视图的layer中

[self.view.layer addSublayer:self.preview];

//设置会话的扫描的大小

if ([UIScreen mainScreen].bounds.size.height == 480)

{

[self.session setSessionPreset:AVCaptureSessionPreset640x480];

}

else

{

[self.session setSessionPreset:AVCaptureSessionPresetHigh];

}

//开始扫描

[self.session startRunning];

}

2 , 创建扫面展示的界面

- (void)initUiConfig

{

//首先调用设置输入输出设备的方法

[self initUI:CGRectMake(0, 0, self.view.bounds.size.width,self.view.bounds.size.height)];

//设置背景图片

_imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pick_bg.png"]];

//设置位置到界面的中间

_imageView.frame = CGRectMake(self.view.bounds.size.width * 0.5 - 140, self.view.bounds.size.height * 0.5 - 140, 280, 280);

//添加到视图上

[self.view addSubview:_imageView];

//初始化二维码的扫描线的位置

_lineImageView = [[UIImageView alloc] initWithFrame:CGRectMake(30, 10, 220, 2)];

_lineImageView.image = [UIImage imageNamed:@"line.png"];

[_imageView addSubview:_lineImageView];

//设置导航控制器的右边的按钮为取消 并且点击了这个按钮就销毁这个modal控制器

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelBtnClick:)];

//开启定时器 执行扫面线的动画;

_timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(animation) userInfo:nil repeats:YES];

}

//执行动画调用的方法

- (void)animation

{

[UIView animateWithDuration:2.8 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

_lineImageView.frame = CGRectMake(30, 260, 220, 2);

} completion:^(BOOL finished) {

_lineImageView.frame = CGRectMake(30, 10, 220, 2);

}];

}

//扫描完成在拿到数据后使用代理传回

//扫描完成的时候就会调用

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

//终止会话

[self.session stopRunning];

//把扫描的layer从主视图的layer中移除

[self.preview removeFromSuperlayer];

NSString *val = nil;

if (metadataObjects.count > 0)

{

//取出最后扫描到的对象

AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

//获得扫描的结果

val = obj.stringValue;

//调用代理的方法 传出扫描到信息

if ([self.delegate respondsToSelector:@selector(qrCodeComplete:)]) {

[self.delegate qrCodeComplete:val];

}

}

}

//这是要用到的属性,代理方法;

@protocol QRViewControllerDelegate

- (void)qrCodeComplete:(NSString *)codeString;

- (void)qrCodeError:(NSError *)error;

@end

@interface QRViewController : UIViewController

@property(assign,nonatomic)iddelegate;

@property (strong,nonatomic)AVCaptureDevice *device;

@property (strong,nonatomic)AVCaptureMetadataOutput *output;

@property (strong,nonatomic)AVCaptureDeviceInput *input;

@property (strong, nonatomic)AVCaptureSession *session;

@property (strong, nonatomic)AVCaptureVideoPreviewLayer *preview;

@end

你可能感兴趣的:(iOS 技术点总结)