Swiftgram/submodules/LegacyComponents/Sources/TGCameraRectangleView.m
2020-08-03 21:04:52 +03:00

103 lines
2.8 KiB
Objective-C

#import "TGCameraRectangleView.h"
#import "TGCameraInterfaceAssets.h"
#import "LegacyComponentsInternal.h"
#import "TGImageUtils.h"
#import "TGCameraPreviewView.h"
#import "PGRectangleDetector.h"
@interface TGCameraRectangleView ()
{
CAShapeLayer *_quadLayer;
bool _clearing;
}
@end
@implementation TGCameraRectangleView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self != nil) {
_enabled = true;
self.backgroundColor = [UIColor clearColor];
self.alpha = 0.0f;
_quadLayer = [[CAShapeLayer alloc] init];
_quadLayer.strokeColor = [[TGCameraInterfaceAssets accentColor] colorWithAlphaComponent:0.7].CGColor;
_quadLayer.fillColor = [[TGCameraInterfaceAssets accentColor] colorWithAlphaComponent:0.45].CGColor;
_quadLayer.lineWidth = 2.0;
[self.layer addSublayer:_quadLayer];
}
return self;
}
- (CGPathRef)pathForRectangle:(PGRectangle *)rectangle
{
CGAffineTransform transform = CGAffineTransformMakeScale(self.previewView.frame.size.width, self.previewView.frame.size.height);
PGRectangle *displayRectangle = [[rectangle rotate90] transform:transform];
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:displayRectangle.topLeft];
[path addLineToPoint:displayRectangle.topRight];
[path addLineToPoint:displayRectangle.bottomRight];
[path addLineToPoint:displayRectangle.bottomLeft];
[path closePath];
return path.CGPath;
}
- (void)drawRectangle:(PGRectangle *)rectangle
{
if (!_enabled) {
return;
}
if (rectangle == nil) {
[self clear];
return;
}
_clearing = false;
[self.layer removeAllAnimations];
bool animated = _quadLayer.path != nil;
if (animated) {
CAAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"];
animation.duration = 0.2;
[_quadLayer addAnimation:animation forKey:@"path"];
} else {
self.transform = CGAffineTransformMakeScale(1.1, 1.1);
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{
self.transform = CGAffineTransformIdentity;
self.alpha = 1.0f;
} completion:nil];
}
_quadLayer.path = [self pathForRectangle:rectangle];
}
- (void)clear
{
if (_quadLayer.path == nil || _clearing)
return;
_clearing = true;
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{
self.alpha = 0.0f;
} completion:^(BOOL finished) {
if (_clearing) {
_quadLayer.path = nil;
_clearing = false;
}
}];
}
- (void)layoutSubviews
{
_quadLayer.frame = self.bounds;
}
@end