// // QRView.m // QRWeiXinDemo // // Created by lovelydd on 15/4/25. // Copyright (c) 2015年 lovelydd. All rights reserved. // #import "QRView.h" #import "QRUtil.h" static NSTimeInterval kQrLineanimateDuration = 0.02; @implementation QRView { UIImageView *qrLine; CGFloat qrLineY; // QRMenu *qrMenu; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } - (void)layoutSubviews { [super layoutSubviews]; if (!qrLine) { [self initQRLine]; NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:kQrLineanimateDuration target:self selector:@selector(show) userInfo:nil repeats:YES]; [timer fire]; } // if (!qrMenu) { // [self initQrMenu]; // } } - (void)initQRLine { CGRect screenBounds = [QRUtil screenBounds]; qrLine = [[UIImageView alloc] initWithFrame:CGRectMake(screenBounds.size.width / 2 - self.transparentArea.width / 2, screenBounds.size.height / 2 - self.transparentArea.height / 2, self.transparentArea.width, 2)]; qrLine.image = [UIImage imageNamed:@"qr_scan_line"]; qrLine.contentMode = UIViewContentModeScaleAspectFill; [self addSubview:qrLine]; qrLineY = qrLine.frame.origin.y; } // //- (void)initQrMenu { // // CGFloat height = 100; // CGFloat width = [QRUtil screenBounds].size.width; // qrMenu = [[QRMenu alloc] initWithFrame:CGRectMake(0, [QRUtil screenBounds].size.height - height, width, height)]; // qrMenu.backgroundColor = [UIColor grayColor]; // [self addSubview:qrMenu]; // // __weak typeof(self)weakSelf = self; // // qrMenu.didSelectedBlock = ^(QRItem *item){ // // NSLog(@"点击的是%u",item.type); // // if ([weakSelf.delegate respondsToSelector:@selector(scanTypeConfig:)] ) { // // [weakSelf.delegate scanTypeConfig:item]; // } // }; //} - (void)show { [UIView animateWithDuration:kQrLineanimateDuration animations:^{ CGRect rect = qrLine.frame; rect.origin.y = qrLineY; qrLine.frame = rect; } completion:^(BOOL finished) { CGFloat maxBorder = self.frame.size.height / 2 + self.transparentArea.height / 2 - 4; if (qrLineY > maxBorder) { qrLineY = self.frame.size.height / 2 - self.transparentArea.height /2; } qrLineY++; }]; } - (void)drawRect:(CGRect)rect { //整个二维码扫描界面的颜色 CGSize screenSize =[QRUtil screenBounds].size; CGRect screenDrawRect =CGRectMake(0, 0, screenSize.width,screenSize.height); //中间清空的矩形框 CGRect clearDrawRect = CGRectMake(screenDrawRect.size.width / 2 - self.transparentArea.width / 2, screenDrawRect.size.height / 2 - self.transparentArea.height / 2, self.transparentArea.width,self.transparentArea.height); CGContextRef ctx = UIGraphicsGetCurrentContext(); [self addScreenFillRect:ctx rect:screenDrawRect]; [self addCenterClearRect:ctx rect:clearDrawRect]; [self addWhiteRect:ctx rect:clearDrawRect]; [self addCornerLineWithContext:ctx rect:clearDrawRect]; } - (void)addScreenFillRect:(CGContextRef)ctx rect:(CGRect)rect { CGContextSetRGBFillColor(ctx, 40 / 255.0,40 / 255.0,40 / 255.0,0.5); CGContextFillRect(ctx, rect); //draw the transparent layer } - (void)addCenterClearRect :(CGContextRef)ctx rect:(CGRect)rect { CGContextClearRect(ctx, rect); //clear the center rect of the layer } - (void)addWhiteRect:(CGContextRef)ctx rect:(CGRect)rect { CGContextStrokeRect(ctx, rect); CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1); CGContextSetLineWidth(ctx, 0.8); CGContextAddRect(ctx, rect); CGContextStrokePath(ctx); } - (void)addCornerLineWithContext:(CGContextRef)ctx rect:(CGRect)rect{ //画四个边角 CGContextSetLineWidth(ctx, 2); CGContextSetRGBStrokeColor(ctx, 89 /255.0, 172/255.0, 220/255.0, 1); //左上角 CGPoint poinsTopLeftA[] = { CGPointMake(rect.origin.x+0.7, rect.origin.y), CGPointMake(rect.origin.x+0.7 , rect.origin.y + 15) }; CGPoint poinsTopLeftB[] = {CGPointMake(rect.origin.x, rect.origin.y +0.7),CGPointMake(rect.origin.x + 15, rect.origin.y+0.7)}; [self addLine:poinsTopLeftA pointB:poinsTopLeftB ctx:ctx]; //左下角 CGPoint poinsBottomLeftA[] = {CGPointMake(rect.origin.x+ 0.7, rect.origin.y + rect.size.height - 15),CGPointMake(rect.origin.x +0.7,rect.origin.y + rect.size.height)}; CGPoint poinsBottomLeftB[] = {CGPointMake(rect.origin.x , rect.origin.y + rect.size.height - 0.7) ,CGPointMake(rect.origin.x+0.7 +15, rect.origin.y + rect.size.height - 0.7)}; [self addLine:poinsBottomLeftA pointB:poinsBottomLeftB ctx:ctx]; //右上角 CGPoint poinsTopRightA[] = {CGPointMake(rect.origin.x+ rect.size.width - 15, rect.origin.y+0.7),CGPointMake(rect.origin.x + rect.size.width,rect.origin.y +0.7 )}; CGPoint poinsTopRightB[] = {CGPointMake(rect.origin.x+ rect.size.width-0.7, rect.origin.y),CGPointMake(rect.origin.x + rect.size.width-0.7,rect.origin.y + 15 +0.7 )}; [self addLine:poinsTopRightA pointB:poinsTopRightB ctx:ctx]; CGPoint poinsBottomRightA[] = {CGPointMake(rect.origin.x+ rect.size.width -0.7 , rect.origin.y+rect.size.height+ -15),CGPointMake(rect.origin.x-0.7 + rect.size.width,rect.origin.y +rect.size.height )}; CGPoint poinsBottomRightB[] = {CGPointMake(rect.origin.x+ rect.size.width - 15 , rect.origin.y + rect.size.height-0.7),CGPointMake(rect.origin.x + rect.size.width,rect.origin.y + rect.size.height - 0.7 )}; [self addLine:poinsBottomRightA pointB:poinsBottomRightB ctx:ctx]; CGContextStrokePath(ctx); } - (void)addLine:(CGPoint[])pointA pointB:(CGPoint[])pointB ctx:(CGContextRef)ctx { CGContextAddLines(ctx, pointA, 2); CGContextAddLines(ctx, pointB, 2); } @end