之前在工作中遇到一些技术上的问题,经过几番查找才得以解决,浪费了不少时间开发中很影响项目进度,最近因为换工作才有时间在这里做一个整理,方便以后的查看,同时分享给大家有这些问题的朋友可以少走弯路;
一, 时间格式的转换
有时候我们想将时间格式调整成自己希望的格式,这个时候我们可以用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