// // YHScanQRView.m // YHAVFoundtionQRScan // // Created by Foxconn on 2018/1/25. // Copyright © 2018年 Foxconn. All rights reserved. // #import "YHScanQRView.h" @interface YHScanQRView () @property (nonatomic, strong) NSTimer *timer; @property (nonatomic, strong) UIImageView *scanningline; @end @implementation YHScanQRView -(instancetype) initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; } return self; } #pragma mark - - - get - (UIImageView *)scanningline { if (!_scanningline) { _scanningline = [[UIImageView alloc] init]; _scanningline.image = [UIImage imageNamed:self.scanningImageName]; } return _scanningline; } #pragma mark - - - set //扫描线名字 - (void)setScanningImageName:(NSString *)scanningImageName { _scanningImageName = scanningImageName; } //边框颜色 - (void)setBorderColor:(UIColor *)borderColor { _borderColor = borderColor; } //边角颜色 - (void)setCornerColor:(UIColor *)cornerColor { _cornerColor = cornerColor; } //边角宽度 - (void)setCornerWidth:(CGFloat)cornerWidth { _cornerWidth = cornerWidth; } //边角长度 - (void)setCornerLenght:(CGFloat)cornerLenght{ _cornerLenght = cornerLenght; } //扫描view周边颜色的alpha值 - (void)setBackgroundAlpha:(CGFloat)backgroundAlpha { _backgroundAlpha = backgroundAlpha; } //边角位置 - (void)setCornerLocation:(CornerLoaction)cornerLocation { _cornerLocation = cornerLocation; } //背景颜色 -(void)setViewBGColor:(UIColor *)viewBGColor{ _viewBGColor = viewBGColor; } //扫描框的X值 -(void)setScanViewX:(float)scanViewX{ _scanViewX = scanViewX; } //扫描框的Y值 -(void)setScanViewY:(float)scanViewY{ _scanViewY = scanViewY; } //扫描框的宽度 -(void)setScanViewWidth:(float)scanViewWidth{ _scanViewWidth = scanViewWidth; } //扫描框的高度 -(void)setScanViewHeight:(float)scanViewHeight{ _scanViewHeight = scanViewHeight; } #pragma mark - - - 添加定时器 - (void)addTimer { CGFloat scanninglineX = 0; CGFloat scanninglineY = 0; CGFloat scanninglineW = 0; CGFloat scanninglineH = 0; [self addSubview:self.scanningline]; scanninglineW = _scanViewWidth; scanninglineH = 12; scanninglineX = _scanViewX; scanninglineY = _scanViewY; _scanningline.frame = CGRectMake(scanninglineX, scanninglineY, scanninglineW, scanninglineH); self.timer = [NSTimer scheduledTimerWithTimeInterval:self.animationTimeInterval target:self selector:@selector(beginTimer) userInfo:nil repeats:YES]; } #pragma mark - - - 移除定时器 - (void)removeTimer { [self.timer invalidate]; self.timer = nil; [self.scanningline removeFromSuperview]; self.scanningline = nil; } #pragma mark - - - 执行定时器方法 - (void)beginTimer { __block CGRect frame = _scanningline.frame; [UIView animateWithDuration:self.animationTimeInterval animations:^{ frame.origin.y = 2 + frame.origin.y; _scanningline.frame = frame; } completion:^(BOOL finished) { if (_scanningline.frame.origin.y >= _scanViewY + _scanViewHeight - 10) { frame.origin.y = _scanViewY; _scanningline.frame = frame; } }]; } //绘制边框 只留下中间的空白区域进行扫描 - (void)drawRect:(CGRect)rect { [super drawRect:rect]; // 边框 frame CGFloat borderW = _scanViewWidth; CGFloat borderH = _scanViewHeight; CGFloat borderX = _scanViewX; CGFloat borderY = _scanViewY; CGFloat borderLineW = 0.2; // 空白区域设置 [[_viewBGColor colorWithAlphaComponent:self.backgroundAlpha] setFill]; UIRectFill(rect); // 获取上下文,并设置混合模式 -> kCGBlendModeDestinationOut CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetBlendMode(context, kCGBlendModeDestinationOut); // 设置空白区 用来扫描 UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(borderX + 0.5 * borderLineW, borderY + 0.5 *borderLineW, borderW - borderLineW, borderH - borderLineW)]; [bezierPath fill]; // 执行混合模式 CGContextSetBlendMode(context, kCGBlendModeNormal); /// 边框设置 UIBezierPath *borderPath = [UIBezierPath bezierPathWithRect:CGRectMake(borderX, borderY, borderW, borderH)]; borderPath.lineCapStyle = kCGLineCapButt; borderPath.lineWidth = borderLineW; [self.borderColor set]; [borderPath stroke]; //边角长度 CGFloat cornerLenght = self.cornerLenght; /// 左上角小图标 UIBezierPath *leftTopPath = [UIBezierPath bezierPath]; leftTopPath.lineWidth = self.cornerWidth; [self.cornerColor set]; CGFloat insideExcess = fabs(0.5 * (self.cornerWidth - borderLineW)); CGFloat outsideExcess = 0.5 * (borderLineW + self.cornerWidth); if (self.cornerLocation == CornerLoactionInside) { [leftTopPath moveToPoint:CGPointMake(borderX + insideExcess, borderY + cornerLenght + insideExcess)]; [leftTopPath addLineToPoint:CGPointMake(borderX + insideExcess, borderY + insideExcess)]; [leftTopPath addLineToPoint:CGPointMake(borderX + cornerLenght + insideExcess, borderY + insideExcess)]; } else if (self.cornerLocation == CornerLoactionOutside) { [leftTopPath moveToPoint:CGPointMake(borderX - outsideExcess, borderY + cornerLenght - outsideExcess)]; [leftTopPath addLineToPoint:CGPointMake(borderX - outsideExcess, borderY - outsideExcess)]; [leftTopPath addLineToPoint:CGPointMake(borderX + cornerLenght - outsideExcess, borderY - outsideExcess)]; } else { [leftTopPath moveToPoint:CGPointMake(borderX, borderY + cornerLenght)]; [leftTopPath addLineToPoint:CGPointMake(borderX, borderY)]; [leftTopPath addLineToPoint:CGPointMake(borderX + cornerLenght, borderY)]; } [leftTopPath stroke]; /// 左下角小图标 UIBezierPath *leftBottomPath = [UIBezierPath bezierPath]; leftBottomPath.lineWidth = self.cornerWidth; [self.cornerColor set]; if (self.cornerLocation == CornerLoactionInside) { [leftBottomPath moveToPoint:CGPointMake(borderX + cornerLenght + insideExcess, borderY + borderH - insideExcess)]; [leftBottomPath addLineToPoint:CGPointMake(borderX + insideExcess, borderY + borderH - insideExcess)]; [leftBottomPath addLineToPoint:CGPointMake(borderX + insideExcess, borderY + borderH - cornerLenght - insideExcess)]; } else if (self.cornerLocation == CornerLoactionOutside) { [leftBottomPath moveToPoint:CGPointMake(borderX + cornerLenght - outsideExcess, borderY + borderH + outsideExcess)]; [leftBottomPath addLineToPoint:CGPointMake(borderX - outsideExcess, borderY + borderH + outsideExcess)]; [leftBottomPath addLineToPoint:CGPointMake(borderX - outsideExcess, borderY + borderH - cornerLenght + outsideExcess)]; } else { [leftBottomPath moveToPoint:CGPointMake(borderX + cornerLenght, borderY + borderH)]; [leftBottomPath addLineToPoint:CGPointMake(borderX, borderY + borderH)]; [leftBottomPath addLineToPoint:CGPointMake(borderX, borderY + borderH - cornerLenght)]; } [leftBottomPath stroke]; /// 右上角小图标 UIBezierPath *rightTopPath = [UIBezierPath bezierPath]; rightTopPath.lineWidth = self.cornerWidth; [self.cornerColor set]; if (self.cornerLocation == CornerLoactionInside) { [rightTopPath moveToPoint:CGPointMake(borderX + borderW - cornerLenght - insideExcess, borderY + insideExcess)]; [rightTopPath addLineToPoint:CGPointMake(borderX + borderW - insideExcess, borderY + insideExcess)]; [rightTopPath addLineToPoint:CGPointMake(borderX + borderW - insideExcess, borderY + cornerLenght + insideExcess)]; } else if (self.cornerLocation == CornerLoactionOutside) { [rightTopPath moveToPoint:CGPointMake(borderX + borderW - cornerLenght + outsideExcess, borderY - outsideExcess)]; [rightTopPath addLineToPoint:CGPointMake(borderX + borderW + outsideExcess, borderY - outsideExcess)]; [rightTopPath addLineToPoint:CGPointMake(borderX + borderW + outsideExcess, borderY + cornerLenght - outsideExcess)]; } else { [rightTopPath moveToPoint:CGPointMake(borderX + borderW - cornerLenght, borderY)]; [rightTopPath addLineToPoint:CGPointMake(borderX + borderW, borderY)]; [rightTopPath addLineToPoint:CGPointMake(borderX + borderW, borderY + cornerLenght)]; } [rightTopPath stroke]; /// 右下角小图标 UIBezierPath *rightBottomPath = [UIBezierPath bezierPath]; rightBottomPath.lineWidth = self.cornerWidth; [self.cornerColor set]; if (self.cornerLocation == CornerLoactionInside) { [rightBottomPath moveToPoint:CGPointMake(borderX + borderW - insideExcess, borderY + borderH - cornerLenght - insideExcess)]; [rightBottomPath addLineToPoint:CGPointMake(borderX + borderW - insideExcess, borderY + borderH - insideExcess)]; [rightBottomPath addLineToPoint:CGPointMake(borderX + borderW - cornerLenght - insideExcess, borderY + borderH - insideExcess)]; } else if (self.cornerLocation == CornerLoactionOutside) { [rightBottomPath moveToPoint:CGPointMake(borderX + borderW + outsideExcess, borderY + borderH - cornerLenght + outsideExcess)]; [rightBottomPath addLineToPoint:CGPointMake(borderX + borderW + outsideExcess, borderY + borderH + outsideExcess)]; [rightBottomPath addLineToPoint:CGPointMake(borderX + borderW - cornerLenght + outsideExcess, borderY + borderH + outsideExcess)]; } else { [rightBottomPath moveToPoint:CGPointMake(borderX + borderW, borderY + borderH - cornerLenght)]; [rightBottomPath addLineToPoint:CGPointMake(borderX + borderW, borderY + borderH)]; [rightBottomPath addLineToPoint:CGPointMake(borderX + borderW - cornerLenght, borderY + borderH)]; } [rightBottomPath stroke]; } @end