ios-unity/QRCodeReaderViewController/QRCameraSwitchButton.m
2022-09-01 11:34:36 +08:00

198 lines
7.2 KiB
Objective-C

/*
* QRCodeReaderViewController
*
* Copyright 2014-present Yannick Loriot.
* http://yannickloriot.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#import "QRCameraSwitchButton.h"
@implementation QRCameraSwitchButton
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
_edgeColor = [UIColor whiteColor];
_fillColor = [UIColor darkGrayColor];
_edgeHighlightedColor = [UIColor whiteColor];
_fillHighlightedColor = [UIColor blackColor];
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGFloat width = rect.size.width;
CGFloat height = rect.size.height;
CGFloat center = width / 2;
CGFloat middle = height / 2;
CGFloat strokeLineWidth = 2;
// Colors
UIColor *paintColor = (self.state != UIControlStateHighlighted) ? _fillColor : _fillHighlightedColor;
UIColor *strokeColor = (self.state != UIControlStateHighlighted) ? _edgeColor : _edgeHighlightedColor;
// Camera box
CGFloat cameraWidth = width * 0.4;
CGFloat cameraHeight = cameraWidth * 0.6;
CGFloat cameraX = center - cameraWidth / 2;
CGFloat cameraY = middle - cameraHeight / 2;
CGFloat cameraRadius = cameraWidth / 80;
UIBezierPath *boxPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(cameraX, cameraY, cameraWidth, cameraHeight) cornerRadius:cameraRadius];
// Camera lens
CGFloat outerLensSize = cameraHeight * 0.8;
CGFloat outerLensX = center - outerLensSize / 2;
CGFloat outerLensY = middle - outerLensSize / 2;
CGFloat innerLensSize = outerLensSize * 0.7;
CGFloat innerLensX = center - innerLensSize / 2;
CGFloat innerLensY = middle - innerLensSize / 2;
UIBezierPath *outerLensPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(outerLensX, outerLensY, outerLensSize, outerLensSize)];
UIBezierPath *innerLensPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(innerLensX, innerLensY, innerLensSize, innerLensSize)];
// Draw flash box
CGFloat flashBoxWidth = cameraWidth * 0.8;
CGFloat flashBoxHeight = cameraHeight * 0.17;
CGFloat flashBoxDeltaWidth = flashBoxWidth * 0.14;
CGFloat flashLeftMostX = cameraX + (cameraWidth - flashBoxWidth) * 0.5;
CGFloat flashBottomMostY = cameraY;
UIBezierPath *flashPath = [UIBezierPath bezierPath];
[flashPath moveToPoint:CGPointMake(flashLeftMostX, flashBottomMostY)];
[flashPath addLineToPoint:CGPointMake(flashLeftMostX + flashBoxWidth, flashBottomMostY)];
[flashPath addLineToPoint:CGPointMake(flashLeftMostX + flashBoxWidth - flashBoxDeltaWidth, flashBottomMostY - flashBoxHeight)];
[flashPath addLineToPoint:CGPointMake(flashLeftMostX + flashBoxDeltaWidth, flashBottomMostY - flashBoxHeight)];
[flashPath closePath];
flashPath.lineCapStyle = kCGLineCapRound;
flashPath.lineJoinStyle = kCGLineJoinRound;
// Arrows
CGFloat arrowHeadHeigth = cameraHeight * 0.5;
CGFloat arrowHeadWidth = ((width - cameraWidth) / 2) * 0.3;
CGFloat arrowTailHeigth = arrowHeadHeigth * 0.6;
CGFloat arrowTailWidth = ((width - cameraWidth) / 2) * 0.7;
// Draw left arrow
CGFloat arrowLeftX = center - cameraWidth * 0.2;
CGFloat arrowLeftY = middle + cameraHeight * 0.45;
UIBezierPath *leftArrowPath = [UIBezierPath bezierPath];
[leftArrowPath moveToPoint:CGPointMake(arrowLeftX, arrowLeftY)];
[leftArrowPath addLineToPoint:CGPointMake(arrowLeftX - arrowHeadWidth, arrowLeftY - arrowHeadHeigth / 2)];
[leftArrowPath addLineToPoint:CGPointMake(arrowLeftX - arrowHeadWidth, arrowLeftY - arrowTailHeigth / 2)];
[leftArrowPath addLineToPoint:CGPointMake(arrowLeftX - arrowHeadWidth - arrowTailWidth, arrowLeftY - arrowTailHeigth / 2)];
[leftArrowPath addLineToPoint:CGPointMake(arrowLeftX - arrowHeadWidth - arrowTailWidth, arrowLeftY + arrowTailHeigth / 2)];
[leftArrowPath addLineToPoint:CGPointMake(arrowLeftX - arrowHeadWidth, arrowLeftY + arrowTailHeigth / 2)];
[leftArrowPath addLineToPoint:CGPointMake(arrowLeftX - arrowHeadWidth, arrowLeftY + arrowHeadHeigth / 2)];
[leftArrowPath closePath];
// Right arrow
CGFloat arrowRightX = center + cameraWidth * 0.2;
CGFloat arrowRightY = middle + cameraHeight * 0.60;
UIBezierPath *rigthArrowPath = [UIBezierPath bezierPath];
[rigthArrowPath moveToPoint:CGPointMake(arrowRightX, arrowRightY)];
[rigthArrowPath addLineToPoint:CGPointMake(arrowRightX + arrowHeadWidth, arrowRightY - arrowHeadHeigth / 2)];
[rigthArrowPath addLineToPoint:CGPointMake(arrowRightX + arrowHeadWidth, arrowRightY - arrowTailHeigth / 2)];
[rigthArrowPath addLineToPoint:CGPointMake(arrowRightX + arrowHeadWidth + arrowTailWidth, arrowRightY - arrowTailHeigth / 2)];
[rigthArrowPath addLineToPoint:CGPointMake(arrowRightX + arrowHeadWidth + arrowTailWidth, arrowRightY + arrowTailHeigth / 2)];
[rigthArrowPath addLineToPoint:CGPointMake(arrowRightX + arrowHeadWidth, arrowRightY + arrowTailHeigth / 2)];
[rigthArrowPath addLineToPoint:CGPointMake(arrowRightX + arrowHeadWidth, arrowRightY + arrowHeadHeigth / 2)];
[rigthArrowPath closePath];
// Drawing
[paintColor setFill];
[rigthArrowPath fill];
[strokeColor setStroke];
rigthArrowPath.lineWidth = strokeLineWidth;
[rigthArrowPath stroke];
[paintColor setFill];
[boxPath fill];
[strokeColor setStroke];
boxPath.lineWidth = strokeLineWidth;
[boxPath stroke];
[strokeColor setFill];
[outerLensPath fill];
[paintColor setFill];
[innerLensPath fill];
[paintColor setFill];
[flashPath fill];
[strokeColor setStroke];
flashPath.lineWidth = strokeLineWidth;
[flashPath stroke];
[paintColor setFill];
[leftArrowPath fill];
[strokeColor setStroke];
leftArrowPath.lineWidth = strokeLineWidth;
[leftArrowPath stroke];
}
// MARK: - UIResponder Methods
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
[self setNeedsDisplay];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
[self setNeedsDisplay];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
[self setNeedsDisplay];
}
@end