From 4219af01e790afe3122dfd22f7d672c36f39bc37 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 27 Jul 2021 13:06:58 +0300 Subject: [PATCH] Various Fixes --- .../Camera/FlashOff.imageset/Contents.json | 12 - .../FlashOff.imageset/ic_cam_flashoff (1).pdf | Bin 4616 -> 0 bytes .../Camera/FlashOn.imageset/Contents.json | 12 - .../FlashOn.imageset/ic_cam_flashon.pdf | Bin 4221 -> 0 bytes .../Sources/TGCameraInterfaceAssets.m | 2 +- .../Sources/TGCameraMainPhoneView.m | 78 ++-- .../Sources/TGCameraZoomView.m | 353 +++++++++++++++--- 7 files changed, 341 insertions(+), 116 deletions(-) delete mode 100644 submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json delete mode 100644 submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/ic_cam_flashoff (1).pdf delete mode 100644 submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/Contents.json delete mode 100644 submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/ic_cam_flashon.pdf diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json deleted file mode 100644 index 3d7da8444b..0000000000 --- a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "ic_cam_flashoff (1).pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/ic_cam_flashoff (1).pdf b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/ic_cam_flashoff (1).pdf deleted file mode 100644 index 883bcd29386d68e9e8b370c955aab17f1e42c35c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4616 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 setZoomLevel:zoomLevel]; + [strongSelf->_zoomModeView setZoomLevel:zoomLevel animated:false]; + + if (!strongSelf->_zoomWheelView.isHidden) { + strongSelf->_dismissingWheel = true; + + TGDispatchAfter(0.6, dispatch_get_main_queue(), ^{ + if (strongSelf->_dismissingWheel) { + [strongSelf->_zoomModeView setHidden:false animated:true]; + [strongSelf->_zoomWheelView setHidden:true animated:true]; + } + }); + } + } else { + strongSelf->_dismissingWheel = false; + [strongSelf->_zoomWheelView setZoomLevel:zoomLevel]; + [strongSelf->_zoomModeView setHidden:true animated:true]; + [strongSelf->_zoomWheelView setHidden:false animated:true]; + } + + if (strongSelf.zoomChanged != nil) + strongSelf.zoomChanged(zoomLevel, animated); + }; + [_zoomModeView setZoomLevel:1.0]; + [self addSubview:_zoomModeView]; + + _zoomWheelView = [[TGCameraZoomWheelView alloc] initWithFrame:CGRectMake(0.0, frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 132, frame.size.width, 132) hasUltrawideCamera:hasUltrawideCamera hasTelephotoCamera:hasTelephotoCamera]; + [_zoomWheelView setHidden:true animated:false]; + [_zoomWheelView setZoomLevel:1.0]; + _zoomWheelView.userInteractionEnabled = false; + [self addSubview:_zoomWheelView]; + _bottomPanelView = [[UIView alloc] init]; [self addSubview:_bottomPanelView]; @@ -263,45 +302,6 @@ _toastView.userInteractionEnabled = false; [self addSubview:_toastView]; - _zoomModeView = [[TGCameraZoomModeView alloc] initWithFrame:CGRectMake(floor((frame.size.width - 129.0) / 2.0), frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 18 - 43, 129, 43) hasUltrawideCamera:hasUltrawideCamera hasTelephotoCamera:hasTelephotoCamera minZoomLevel:hasUltrawideCamera ? 0.5 : 1.0 maxZoomLevel:8.0]; - _zoomModeView.zoomChanged = ^(CGFloat zoomLevel, bool done, bool animated) { - __strong TGCameraMainPhoneView *strongSelf = weakSelf; - if (strongSelf == nil) - return; - - if (done) { - [strongSelf->_zoomWheelView setZoomLevel:zoomLevel]; - [strongSelf->_zoomModeView setZoomLevel:zoomLevel animated:false]; - - if (!strongSelf->_zoomWheelView.isHidden) { - strongSelf->_dismissingWheel = true; - - TGDispatchAfter(0.6, dispatch_get_main_queue(), ^{ - if (strongSelf->_dismissingWheel) { - [strongSelf->_zoomModeView setHidden:false animated:true]; -// [strongSelf->_zoomWheelView setHidden:true animated:true]; - } - }); - } - } else { - strongSelf->_dismissingWheel = false; - [strongSelf->_zoomWheelView setZoomLevel:zoomLevel]; - [strongSelf->_zoomModeView setHidden:true animated:true]; -// [strongSelf->_zoomWheelView setHidden:false animated:true]; - } - - if (strongSelf.zoomChanged != nil) - strongSelf.zoomChanged(zoomLevel, animated); - }; - [_zoomModeView setZoomLevel:1.0]; - [self addSubview:_zoomModeView]; - - _zoomWheelView = [[TGCameraZoomWheelView alloc] initWithFrame:CGRectMake(0.0, frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 132, frame.size.width, 132) hasUltrawideCamera:hasUltrawideCamera hasTelephotoCamera:hasTelephotoCamera]; - [_zoomWheelView setHidden:true animated:false]; - [_zoomWheelView setZoomLevel:1.0]; - _zoomWheelView.userInteractionEnabled = false; - [self addSubview:_zoomWheelView]; - _flashControl.modeChanged = ^(PGCameraFlashMode mode) { __strong TGCameraMainPhoneView *strongSelf = weakSelf; diff --git a/submodules/LegacyComponents/Sources/TGCameraZoomView.m b/submodules/LegacyComponents/Sources/TGCameraZoomView.m index 1c0e22d43b..8c2a5ab898 100644 --- a/submodules/LegacyComponents/Sources/TGCameraZoomView.m +++ b/submodules/LegacyComponents/Sources/TGCameraZoomView.m @@ -196,6 +196,7 @@ _label = [[UILabel alloc] initWithFrame:self.bounds]; _label.textAlignment = NSTextAlignmentCenter; + _label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; [self addSubview:_backgroundView]; [self addSubview:_label]; @@ -209,7 +210,6 @@ _label.text = value; _label.textColor = selected ? [TGCameraInterfaceAssets accentColor] : [UIColor whiteColor]; - _label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; if (animated) { [UIView animateWithDuration:0.3f animations:^ @@ -225,7 +225,7 @@ @end -@interface TGCameraZoomModeView () +@interface TGCameraZoomModeView () { CGFloat _minZoomLevel; CGFloat _maxZoomLevel; @@ -276,14 +276,24 @@ } UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)]; + panGestureRecognizer.delegate = self; [self addGestureRecognizer:panGestureRecognizer]; UILongPressGestureRecognizer *pressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pressGesture:)]; + pressGestureRecognizer.delegate = self; [self addGestureRecognizer:pressGestureRecognizer]; } return self; } +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + if (gestureRecognizer.view == self && otherGestureRecognizer.view == self) { + return true; + } else { + return false; + } +} + - (void)pressGesture:(UILongPressGestureRecognizer *)gestureRecognizer { switch (gestureRecognizer.state) { case UIGestureRecognizerStateBegan: @@ -305,8 +315,14 @@ switch (gestureRecognizer.state) { case UIGestureRecognizerStateChanged: - _zoomLevel = MAX(0.5, MIN(10.0, _zoomLevel - translation.x / 100.0)); + { + CGFloat delta = -translation.x / 100.0; + if (_zoomLevel > 2.0) { + delta *= 2.0; + } + _zoomLevel = MAX(0.5, MIN(10.0, _zoomLevel + delta)); self.zoomChanged(_zoomLevel, false, false); + } break; default: break; @@ -363,15 +379,19 @@ [_rightItem setValue:@"2" selected:false animated:animated]; } else { [_leftItem setValue:@"0,5" selected:false animated:animated]; - [_centerItem setValue:@"1" selected:false animated:animated]; - + CGFloat near = round(zoomLevel); - if (ABS(zoomLevel - near) < 0.1) { - [_rightItem setValue:[NSString stringWithFormat:@"%dx", (int)zoomLevel] selected:true animated:animated]; + NSString *value; + if (ABS(zoomLevel - near) < 0.05) { + value = [NSString stringWithFormat:@"%dx", (int)zoomLevel]; } else { - NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; - value = [value stringByReplacingOccurrencesOfString:@"." withString:@","]; + value = [[NSString stringWithFormat:@"%.1fx", zoomLevel] stringByReplacingOccurrencesOfString:@"." withString:@","]; + } + if (_rightItem.superview != nil) { + [_centerItem setValue:@"1" selected:false animated:animated]; [_rightItem setValue:value selected:true animated:animated]; + } else { + [_centerItem setValue:value selected:true animated:animated]; } } } @@ -437,7 +457,17 @@ { bool _hasUltrawideCamera; bool _hasTelephotoCamera; + UIView *_containerView; UIImageView *_backgroundView; + UIImageView *_scaleView; + UIImageView *_maskView; + UIImageView *_arrowView; + + UILabel *_valueLabel; + UILabel *_05Label; + UILabel *_1Label; + UILabel *_2Label; + UILabel *_8Label; } @end @@ -459,63 +489,254 @@ CGContextRestoreGState(context); } +- (NSArray *)ultraLines { + return @[ + @[@0.5, @-19.6, @3], + @[@0.6, @-14.4, @1], + @[@0.7, @-10.0, @1], + @[@0.8, @-6.3, @1], + @[@0.9, @-3.0, @1] + ]; +} + +- (NSArray *)lines { + return @[ + @[@1.0, @0.0, @3], + + @[@1.1, @2.7, @1], + @[@1.2, @5.2, @1], + @[@1.3, @7.4, @1], + @[@1.4, @9.6, @1], + @[@1.5, @11.5, @1], + @[@1.6, @13.3, @1], + @[@1.7, @15.0, @1], + @[@1.8, @16.7, @1], + @[@1.9, @18.2, @1], + @[@2.0, @19.6, _hasTelephotoCamera ? @3 : @2], + + @[@2.1, @21.0, @1], + @[@2.2, @22.4, @1], + @[@2.3, @23.7, @1], + @[@2.4, @24.8, @1], + @[@2.5, @26.0, @1], + @[@2.6, @27.1, @1], + @[@2.7, @28.2, @1], + @[@2.8, @29.2, @1], + @[@2.9, @30.2, @1], + @[@3.0, @31.1, @2], + + @[@3.1, @32.0, @1], + @[@3.2, @32.9, @1], + @[@3.3, @33.8, @1], + @[@3.4, @34.7, @1], + @[@3.5, @35.5, @1], + @[@3.6, @36.34, @1], + @[@3.7, @37.1, @1], + @[@3.8, @37.85, @1], + @[@3.9, @38.55, @1], + @[@4.0, @39.3, @2], + + @[@4.1, @40.0, @1], + @[@4.2, @40.77, @1], + @[@4.3, @41.4, @1], + @[@4.4, @42.05, @1], + @[@4.5, @42.63, @1], + @[@4.6, @43.3, @1], + @[@4.7, @43.89, @1], + @[@4.8, @44.42, @1], + @[@4.9, @45.05, @1], + @[@5.0, @45.6, @2], + + @[@5.1, @46.17, @1], + @[@5.2, @46.77, @1], + @[@5.3, @47.31, @1], + @[@5.4, @47.78, @1], + @[@5.5, @48.34, @1], + @[@5.6, @48.8, @1], + @[@5.7, @49.31, @1], + @[@5.8, @49.85, @1], + @[@5.9, @50.3, @1], + @[@6.0, @50.8, @2], + + @[@6.1, @51.25, @1], + @[@6.2, @51.7, @1], + @[@6.3, @52.18, @1], + @[@6.4, @52.63, @1], + @[@6.5, @53.12, @1], + @[@6.6, @53.49, @1], + @[@6.7, @53.88, @1], + @[@6.8, @54.28, @1], + @[@6.9, @54.71, @1], + @[@7.0, @55.15, @2], + + @[@7.1, @55.53, @1], + @[@7.2, @55.91, @1], + @[@7.3, @56.36, @1], + @[@7.4, @56.74, @1], + @[@7.5, @57.09, @1], + @[@7.6, @57.52, @1], + @[@7.7, @57.89, @1], + @[@7.8, @58.19, @1], + @[@7.9, @58.56, @1], + @[@8.0, @58.93, @3], + ]; +} + - (instancetype)initWithFrame:(CGRect)frame hasUltrawideCamera:(bool)hasUltrawideCamera hasTelephotoCamera:(bool)hasTelephotoCamera { self = [super initWithFrame:frame]; if (self != nil) { - _hasUltrawideCamera = true;// hasUltrawideCamera; - _hasTelephotoCamera = true;//hasTelephotoCamera; + TGIsRetina(); + + _hasUltrawideCamera = hasUltrawideCamera; + _hasTelephotoCamera = hasTelephotoCamera; self.clipsToBounds = true; CGFloat side = floor(frame.size.width * 1.1435); CGFloat length = 17.0; CGFloat smallWidth = MAX(0.5, 1.0 - TGScreenPixel); - CGFloat mediumWidth = 1.0; - CGFloat bigWidth = 1.0 + TGScreenPixel; - - CGFloat smallAngle = M_PI * 0.12; - CGFloat finalAngle = 1.08; + CGFloat mediumWidth = smallWidth; + CGFloat bigWidth = 1.0; + _backgroundView = [[UIImageView alloc] initWithImage:TGCircleImage(side, [UIColor colorWithWhite:0.0 alpha:0.75])]; + _backgroundView.frame = CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, side); + [self addSubview:_backgroundView]; + UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, side), false, 0.0f); CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetFillColorWithColor(context, [UIColor colorWithWhite:0.0 alpha:0.75].CGColor); - CGContextFillEllipseInRect(context, CGRectMake(0, 0, side, side)); - [self _drawLineInContext:context side:side atAngle:0.0 lineLength:length lineWidth:bigWidth opaque:true]; + NSArray *ultraLines = [self ultraLines]; + NSArray *lines = [self lines]; if (_hasUltrawideCamera) { - for (NSInteger i = 0; i < 4; i++) { - CGFloat angle = (smallAngle / 5.0) * (i + 1) + (0.007 * (i - 1)); - [self _drawLineInContext:context side:side atAngle:-angle lineLength:length lineWidth:smallWidth opaque:false]; + for (NSArray *values in ultraLines) { + CGFloat angle = [values[1] floatValue]; + CGFloat width = [values[2] intValue]; + + CGFloat lineWidth = smallWidth; + if (width == 2) { + lineWidth = mediumWidth; + } else if (width == 3) { + lineWidth = bigWidth; + } + [self _drawLineInContext:context side:side atAngle:TGDegreesToRadians(angle) lineLength:length lineWidth:lineWidth opaque:width > 1]; } - [self _drawLineInContext:context side:side atAngle:-smallAngle lineLength:length lineWidth:bigWidth opaque:true]; } - if (_hasTelephotoCamera) { - [self _drawLineInContext:context side:side atAngle:smallAngle lineLength:length lineWidth:bigWidth opaque:true]; + for (NSArray *values in lines) { + CGFloat angle = [values[1] floatValue]; + CGFloat width = [values[2] intValue]; - for (NSInteger i = 0; i < 4; i++) { - CGFloat angle = (smallAngle / 5.0) * (i + 1) + (0.01 * (i - 1)); - [self _drawLineInContext:context side:side atAngle:angle lineLength:length lineWidth:smallWidth opaque:false]; + CGFloat lineWidth = smallWidth; + if (width == 2) { + lineWidth = mediumWidth; + } else if (width == 3) { + lineWidth = bigWidth; } - [self _drawLineInContext:context side:side atAngle:finalAngle lineLength:length lineWidth:bigWidth opaque:true]; - } else { - [self _drawLineInContext:context side:side atAngle:smallAngle lineLength:length lineWidth:mediumWidth opaque:true]; - - [self _drawLineInContext:context side:side atAngle:finalAngle lineLength:length lineWidth:bigWidth opaque:true]; + [self _drawLineInContext:context side:side atAngle:TGDegreesToRadians(angle) lineLength:length lineWidth:lineWidth opaque:width > 1]; } - - - UIImage *image = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:25 topCapHeight:25]; + + UIImage *scaleImage = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:25 topCapHeight:25]; UIGraphicsEndImageContext(); - _backgroundView = [[UIImageView alloc] initWithFrame:CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, side)]; - _backgroundView.image = image; + _containerView = [[UIView alloc] initWithFrame:CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, frame.size.height)]; + [self addSubview:_containerView]; + + UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, frame.size.height), false, 0.0f); + context = UIGraphicsGetCurrentContext(); - [self addSubview:_backgroundView]; + CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); + CGContextFillEllipseInRect(context, CGRectMake(0, 0, side, side)); + + CGContextSetBlendMode(context, kCGBlendModeClear); + CGContextMoveToPoint(context, side / 2.0 - 7.0, 0); + CGContextAddLineToPoint(context, side / 2.0 + 7.0, 0); + CGContextAddLineToPoint(context, side / 2.0 + 2.0, 22); + CGContextAddLineToPoint(context, side / 2.0 - 2.0, 22); + CGContextClosePath(context); + CGContextFillPath(context); + + CGContextFillRect(context, CGRectMake(side / 2.0 - 1.0, 20, 2.0, 7.0)); + CGContextFillEllipseInRect(context, CGRectMake(side / 2.0 - 18.0, 20.0, 36.0, 36.0)); + + UIImage *maskImage = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:25 topCapHeight:25]; + UIGraphicsEndImageContext(); + + _maskView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, side, frame.size.height)]; + _maskView.image = maskImage; + _containerView.maskView = _maskView; + + _scaleView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, side, side)]; + _scaleView.image = scaleImage; + [_containerView addSubview:_scaleView]; + + UIGraphicsBeginImageContextWithOptions(CGSizeMake(4, 10), false, 0.0f); + context = UIGraphicsGetCurrentContext(); + + CGContextSetFillColorWithColor(context, [TGCameraInterfaceAssets accentColor].CGColor); + CGContextMoveToPoint(context, 0, 0); + CGContextAddLineToPoint(context, 4, 0); + CGContextAddLineToPoint(context, 2 + TGScreenPixel, 10); + CGContextAddLineToPoint(context, 2 - TGScreenPixel, 10); + CGContextClosePath(context); + CGContextFillPath(context); + + UIImage *arrowImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + _arrowView = [[UIImageView alloc] initWithFrame:CGRectMake(floor((frame.size.width - 4) / 2.0), 4, 4, 10)]; + _arrowView.image = arrowImage; + [self addSubview:_arrowView]; + + _valueLabel = [[UILabel alloc] init]; + _valueLabel.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; + _valueLabel.textColor = [TGCameraInterfaceAssets accentColor]; + [self addSubview:_valueLabel]; + + CGFloat radius = side / 2.0; + if (_hasUltrawideCamera) { + _05Label = [[UILabel alloc] init]; + _05Label.text = @"0,5"; + _05Label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; + _05Label.textColor = [UIColor whiteColor]; + [_05Label sizeToFit]; + [_scaleView addSubview:_05Label]; + + _05Label.center = CGPointMake(radius - sin(TGDegreesToRadians(19.6)) * (radius - 38.0), radius - cos(TGDegreesToRadians(19.6)) * (radius - 38.0)); + _05Label.transform = CGAffineTransformMakeRotation(TGDegreesToRadians(-19.6)); + } + + _1Label = [[UILabel alloc] init]; + _1Label.text = @"1"; + _1Label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; + _1Label.textColor = [UIColor whiteColor]; + [_1Label sizeToFit]; + _1Label.frame = CGRectMake(TGScreenPixelFloor((_scaleView.bounds.size.width - _1Label.frame.size.width) / 2.0), 30.0, _1Label.frame.size.width, _1Label.frame.size.height); + [_scaleView addSubview:_1Label]; + + if (_hasTelephotoCamera) { + _2Label = [[UILabel alloc] init]; + _2Label.text = @"2,0"; + _2Label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; + _2Label.textColor = [UIColor whiteColor]; + [_2Label sizeToFit]; + [_scaleView addSubview:_2Label]; + + _2Label.center = CGPointMake(radius - sin(TGDegreesToRadians(-19.6)) * (radius - 38.0), radius - cos(TGDegreesToRadians(-19.6)) * (radius - 38.0)); + _2Label.transform = CGAffineTransformMakeRotation(TGDegreesToRadians(19.6)); + } + + _8Label = [[UILabel alloc] init]; + _8Label.text = @"8"; + _8Label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; + _8Label.textColor = [UIColor whiteColor]; + [_8Label sizeToFit]; + [_scaleView addSubview:_8Label]; + + _8Label.center = CGPointMake(radius - sin(TGDegreesToRadians(-58.93)) * (radius - 38.0), radius - cos(TGDegreesToRadians(-58.93)) * (radius - 38.0)); + _8Label.transform = CGAffineTransformMakeRotation(TGDegreesToRadians(58.93)); } return self; } @@ -524,19 +745,47 @@ zoomLevel = MAX(0.5, zoomLevel); _zoomLevel = zoomLevel; - CGFloat angle = 0.0; - if (zoomLevel < 1.0) { - CGFloat delta = (zoomLevel - 0.5) / 0.5; - angle = TGDegreesToRadians(20.8) * (1.0 - delta); - } else if (zoomLevel < 2.0) { - CGFloat delta = zoomLevel - 1.0; - angle = TGDegreesToRadians(-22.0) * delta; - } else if (zoomLevel < 10.0) { - CGFloat delta = (zoomLevel - 2.0) / 8.0; - angle = TGDegreesToRadians(-22.0) + TGDegreesToRadians(-68.0) * delta; - } + NSArray *ultraLines = [self ultraLines]; + NSArray *lines = [self lines]; - _backgroundView.transform = CGAffineTransformMakeRotation(angle); + CGFloat finalAngle = 0.0; + NSArray *allLines = [ultraLines arrayByAddingObjectsFromArray:lines]; + NSArray *previous = nil; + for (NSArray *values in allLines) { + CGFloat value = [values[0] floatValue]; + CGFloat angle = [values[1] floatValue]; + + if (previous == nil && zoomLevel <= value) { + finalAngle = angle; + break; + } + + if (previous != nil && zoomLevel < value) { + CGFloat previousValue = [previous[0] floatValue]; + CGFloat previousAngle = [previous[1] floatValue]; + + if (zoomLevel > previousValue) { + CGFloat factor = (zoomLevel - previousValue) / (value - previousValue); + finalAngle = previousAngle + (angle - previousAngle) * factor; + break; + } + } + previous = values; + } + finalAngle = -TGDegreesToRadians(finalAngle); + + _scaleView.transform = CGAffineTransformMakeRotation(finalAngle); + + CGFloat near = round(zoomLevel); + NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; + value = [value stringByReplacingOccurrencesOfString:@"." withString:@","]; + if (ABS(zoomLevel - near) < 0.05) { + value = [NSString stringWithFormat:@"%dx", (int)near]; + } + _valueLabel.text = value; + [_valueLabel sizeToFit]; + + _valueLabel.frame = CGRectMake(TGScreenPixelFloor((self.frame.size.width - _valueLabel.frame.size.width) / 2.0), 30.0, _valueLabel.frame.size.width, _valueLabel.frame.size.height); } - (void)setHidden:(BOOL)hidden