mirror of
https://github.com/danog/Telegram.git
synced 2024-12-02 09:27:55 +01:00
175 lines
5.1 KiB
Objective-C
175 lines
5.1 KiB
Objective-C
#import "TGCameraZoomView.h"
|
|
#import "TGCameraInterfaceAssets.h"
|
|
|
|
@interface TGCameraZoomView ()
|
|
{
|
|
UIView *_clipView;
|
|
UIView *_wrapperView;
|
|
|
|
UIView *_minusIconView;
|
|
UIView *_plusIconView;
|
|
|
|
UIView *_leftLine;
|
|
UIView *_rightLine;
|
|
UIImageView *_knobView;
|
|
}
|
|
@end
|
|
|
|
@implementation TGCameraZoomView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self != nil)
|
|
{
|
|
self.userInteractionEnabled = false;
|
|
|
|
_clipView = [[UIView alloc] init];
|
|
_clipView.clipsToBounds = true;
|
|
[self addSubview:_clipView];
|
|
|
|
_wrapperView = [[UIView alloc] initWithFrame:self.bounds];
|
|
[_clipView addSubview:_wrapperView];
|
|
|
|
_leftLine = [[UIView alloc] initWithFrame:CGRectMake(-1000, (12.5f - 1.5f) / 2, 1000, 1.5f)];
|
|
_leftLine.backgroundColor = [TGCameraInterfaceAssets normalColor];
|
|
[_wrapperView addSubview:_leftLine];
|
|
|
|
_rightLine = [[UIView alloc] initWithFrame:CGRectMake(12.5f, (12.5 - 1.5f) / 2, 1000, 1.5f)];
|
|
_rightLine.backgroundColor = [TGCameraInterfaceAssets normalColor];
|
|
[_wrapperView addSubview:_rightLine];
|
|
|
|
static UIImage *knobImage = nil;
|
|
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(12.5f, 12.5f), false, 0.0f);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGContextSetStrokeColorWithColor(context, [TGCameraInterfaceAssets accentColor].CGColor);
|
|
CGContextSetLineWidth(context, 1.5f);
|
|
CGContextStrokeEllipseInRect(context, CGRectMake(0.75f, 0.75f, 12.5f - 1.5f, 12.5f - 1.5f));
|
|
|
|
knobImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
});
|
|
|
|
_knobView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 12.5f, 12.5f)];
|
|
_knobView.image = knobImage;
|
|
[_wrapperView addSubview:_knobView];
|
|
|
|
_minusIconView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 9.5f, 1.5f)];
|
|
_minusIconView.backgroundColor = [TGCameraInterfaceAssets normalColor];
|
|
_minusIconView.layer.cornerRadius = 1;
|
|
[self addSubview:_minusIconView];
|
|
|
|
_plusIconView = [[UIView alloc] initWithFrame:CGRectMake(frame.size.width - 9.5f, 0, 9.5f, 1.5f)];
|
|
_plusIconView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
|
|
_plusIconView.backgroundColor = [TGCameraInterfaceAssets normalColor];
|
|
_plusIconView.layer.cornerRadius = 1;
|
|
[self addSubview:_plusIconView];
|
|
|
|
CALayer *plusVertLayer = [[CALayer alloc] init];
|
|
plusVertLayer.backgroundColor = [TGCameraInterfaceAssets normalColor].CGColor;
|
|
plusVertLayer.cornerRadius = 1;
|
|
plusVertLayer.frame = CGRectMake((9.5f - 1.5f) / 2, -(9.5f - 1.5f) / 2, 1.5f, 9.5f);
|
|
[_plusIconView.layer addSublayer:plusVertLayer];
|
|
|
|
[self hideAnimated:false];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)setZoomLevel:(CGFloat)zoomLevel
|
|
{
|
|
[self setZoomLevel:zoomLevel displayNeeded:true];
|
|
}
|
|
|
|
- (void)setZoomLevel:(CGFloat)zoomLevel displayNeeded:(bool)displayNeeded
|
|
{
|
|
_zoomLevel = zoomLevel;
|
|
[self setNeedsLayout];
|
|
|
|
if (displayNeeded)
|
|
{
|
|
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hideAnimated) object:nil];
|
|
|
|
if (self.alpha < FLT_EPSILON)
|
|
[self showAnimated:true];
|
|
}
|
|
}
|
|
|
|
- (bool)isActive
|
|
{
|
|
return (self.alpha > FLT_EPSILON);
|
|
}
|
|
|
|
- (void)showAnimated:(bool)animated
|
|
{
|
|
if (self.activityChanged != nil)
|
|
self.activityChanged(true);
|
|
|
|
if (animated)
|
|
{
|
|
[UIView animateWithDuration:0.3f animations:^
|
|
{
|
|
self.alpha = 1.0f;
|
|
}];
|
|
}
|
|
else
|
|
{
|
|
self.alpha = 1.0f;
|
|
}
|
|
}
|
|
|
|
- (void)hideAnimated:(bool)animated
|
|
{
|
|
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hideAnimated) object:nil];
|
|
|
|
if (animated)
|
|
{
|
|
[UIView animateWithDuration:0.3f animations:^
|
|
{
|
|
self.alpha = 0.0f;
|
|
} completion:^(__unused BOOL finished)
|
|
{
|
|
if (finished)
|
|
{
|
|
if (self.activityChanged != nil)
|
|
self.activityChanged(false);
|
|
}
|
|
}];
|
|
}
|
|
else
|
|
{
|
|
self.alpha = 0.0f;
|
|
|
|
if (self.activityChanged != nil)
|
|
self.activityChanged(false);
|
|
}
|
|
}
|
|
|
|
- (void)hideAnimated
|
|
{
|
|
[self hideAnimated:true];
|
|
}
|
|
|
|
- (void)interactionEnded
|
|
{
|
|
[self performSelector:@selector(hideAnimated) withObject:nil afterDelay:4.0f];
|
|
}
|
|
|
|
- (void)layoutSubviews
|
|
{
|
|
_clipView.frame = CGRectMake(22, (self.frame.size.height - 12.5f) / 2, self.frame.size.width - 44, 12.5f);
|
|
|
|
CGFloat position = (_clipView.frame.size.width - _knobView.frame.size.width) * self.zoomLevel;
|
|
if (self.zoomLevel < 1.0f - FLT_EPSILON)
|
|
position = CGFloor(position);
|
|
|
|
_wrapperView.frame = CGRectMake(position, 0, _wrapperView.frame.size.width, _wrapperView.frame.size.height);
|
|
}
|
|
|
|
@end
|