Various Fixes

This commit is contained in:
Ilya Laktyushin 2021-07-27 14:35:45 +03:00
parent 88994260da
commit 161cad3f0a
6 changed files with 97 additions and 39 deletions

View File

@ -27,6 +27,8 @@
- (void)setHidden:(bool)hidden animated:(bool)animated; - (void)setHidden:(bool)hidden animated:(bool)animated;
- (void)panGesture:(UIPanGestureRecognizer *)gestureRecognizer;
- (instancetype)initWithFrame:(CGRect)frame hasUltrawideCamera:(bool)hasUltrawideCamera hasTelephotoCamera:(bool)hasTelephotoCamera minZoomLevel:(CGFloat)minZoomLevel maxZoomLevel:(CGFloat)maxZoomLevel; - (instancetype)initWithFrame:(CGRect)frame hasUltrawideCamera:(bool)hasUltrawideCamera hasTelephotoCamera:(bool)hasTelephotoCamera minZoomLevel:(CGFloat)minZoomLevel maxZoomLevel:(CGFloat)maxZoomLevel;
@end @end
@ -34,7 +36,10 @@
@interface TGCameraZoomWheelView : UIView @interface TGCameraZoomWheelView : UIView
@property (copy, nonatomic) void(^panGesture)(UIPanGestureRecognizer *gestureRecognizer);
@property (nonatomic, assign) CGFloat zoomLevel; @property (nonatomic, assign) CGFloat zoomLevel;
- (void)setZoomLevel:(CGFloat)zoomLevel panning:(bool)panning;
- (void)setHidden:(bool)hidden animated:(bool)animated; - (void)setHidden:(bool)hidden animated:(bool)animated;

View File

@ -537,7 +537,7 @@ const NSInteger PGCameraFrameRate = 30;
return; return;
CGFloat level = zoomLevel; CGFloat level = zoomLevel;
CGFloat backingLevel = 1.0; CGFloat backingLevel = zoomLevel;
if (iosMajorVersion() >= 13.0 && device.isVirtualDevice) { if (iosMajorVersion() >= 13.0 && device.isVirtualDevice) {
NSArray *marks = device.virtualDeviceSwitchOverVideoZoomFactors; NSArray *marks = device.virtualDeviceSwitchOverVideoZoomFactors;
if (marks.count == 2) { if (marks.count == 2) {
@ -830,6 +830,9 @@ const NSInteger PGCameraFrameRate = 30;
if (device == nil) { if (device == nil) {
device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInDualCamera mediaType:AVMediaTypeVideo position:position]; device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInDualCamera mediaType:AVMediaTypeVideo position:position];
} }
if (device == nil) {
device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInDualWideCamera mediaType:AVMediaTypeVideo position:position];
}
if (device != nil) { if (device != nil) {
return device; return device;
} }

View File

@ -594,7 +594,8 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
TGDispatchOnMainThread(^ TGDispatchOnMainThread(^
{ {
[strongSelf->_previewView endTransitionAnimated:true]; [strongSelf->_previewView endTransitionAnimated:true];
[strongSelf->_interfaceView setZoomLevel:1.0f displayNeeded:false];
if (!strongSelf->_dismissing) if (!strongSelf->_dismissing)
{ {
strongSelf.view.userInteractionEnabled = true; strongSelf.view.userInteractionEnabled = true;
@ -803,7 +804,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
{ {
[strongSelf->_previewView beginTransitionWithSnapshotImage:image animated:false]; [strongSelf->_previewView beginTransitionWithSnapshotImage:image animated:false];
TGDispatchAfter(0.05, dispatch_get_main_queue(), ^{ TGDispatchAfter(0.15, dispatch_get_main_queue(), ^{
[strongSelf->_previewView endTransitionAnimated:true]; [strongSelf->_previewView endTransitionAnimated:true];
strongSelf->_crossfadingForZoom = false; strongSelf->_crossfadingForZoom = false;
}); });

View File

@ -27,6 +27,8 @@ const CGFloat TGCameraFlashControlHeight = 44.0f;
self = [super initWithFrame:frame]; self = [super initWithFrame:frame];
if (self != nil) { if (self != nil) {
self.contentMode = UIViewContentModeRedraw; self.contentMode = UIViewContentModeRedraw;
self.opaque = false;
self.backgroundColor = [UIColor clearColor];
} }
return self; return self;
} }
@ -102,7 +104,8 @@ const CGFloat TGCameraFlashControlHeight = 44.0f;
CGPathRelease(strokedPath); CGPathRelease(strokedPath);
CGPathRelease(path); CGPathRelease(path);
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextDrawPath(context, kCGPathFillStroke); CGContextDrawPath(context, kCGPathFillStroke);
} }

View File

@ -137,7 +137,7 @@
_topPanelOffset = 33.0f; _topPanelOffset = 33.0f;
_topPanelHeight = 44.0f; _topPanelHeight = 44.0f;
_bottomPanelOffset = 63.0f; _bottomPanelOffset = 63.0f;
_bottomPanelHeight = 123.0f; _bottomPanelHeight = 128.0f;
_modeControlOffset = 3.0f; _modeControlOffset = 3.0f;
_modeControlHeight = 40.0f; _modeControlHeight = 40.0f;
_counterOffset = 7.0f; _counterOffset = 7.0f;
@ -220,7 +220,7 @@
} }
} else { } else {
strongSelf->_dismissingWheel = false; strongSelf->_dismissingWheel = false;
[strongSelf->_zoomWheelView setZoomLevel:zoomLevel]; [strongSelf->_zoomWheelView setZoomLevel:zoomLevel panning:true];
[strongSelf->_zoomModeView setHidden:true animated:true]; [strongSelf->_zoomModeView setHidden:true animated:true];
[strongSelf->_zoomWheelView setHidden:false animated:true]; [strongSelf->_zoomWheelView setHidden:false animated:true];
} }
@ -234,7 +234,12 @@
_zoomWheelView = [[TGCameraZoomWheelView alloc] initWithFrame:CGRectMake(0.0, frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 132, frame.size.width, 132) hasUltrawideCamera:hasUltrawideCamera hasTelephotoCamera:hasTelephotoCamera]; _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 setHidden:true animated:false];
[_zoomWheelView setZoomLevel:1.0]; [_zoomWheelView setZoomLevel:1.0];
_zoomWheelView.userInteractionEnabled = false; _zoomWheelView.panGesture = ^(UIPanGestureRecognizer *gestureRecognizer) {
__strong TGCameraMainPhoneView *strongSelf = weakSelf;
if (strongSelf == nil)
return;
[strongSelf->_zoomModeView panGesture:gestureRecognizer];
};
[self addSubview:_zoomWheelView]; [self addSubview:_zoomWheelView];
_bottomPanelView = [[UIView alloc] init]; _bottomPanelView = [[UIView alloc] init];
@ -444,7 +449,7 @@
{ {
UIView *view = [super hitTest:point withEvent:event]; UIView *view = [super hitTest:point withEvent:event];
if ([view isDescendantOfView:_topPanelView] || [view isDescendantOfView:_bottomPanelView] || [view isDescendantOfView:_videoLandscapePanelView] || [view isDescendantOfView:_tooltipContainerView] || [view isDescendantOfView:_selectedPhotosView] || [view isDescendantOfView:_zoomModeView] || view == _zoomModeView) if ([view isDescendantOfView:_topPanelView] || [view isDescendantOfView:_bottomPanelView] || [view isDescendantOfView:_videoLandscapePanelView] || [view isDescendantOfView:_tooltipContainerView] || [view isDescendantOfView:_selectedPhotosView] || [view isDescendantOfView:_zoomModeView] || view == _zoomModeView || (view == _zoomWheelView && !_zoomWheelView.isHidden))
return view; return view;
return nil; return nil;

View File

@ -318,12 +318,21 @@
{ {
CGFloat delta = -translation.x / 100.0; CGFloat delta = -translation.x / 100.0;
if (_zoomLevel > 2.0) { if (_zoomLevel > 2.0) {
delta *= 2.0; delta *= 2.2;
} }
_zoomLevel = MAX(0.5, MIN(10.0, _zoomLevel + delta));
_zoomLevel = MAX(_minZoomLevel, MIN(_maxZoomLevel, _zoomLevel + delta));
self.zoomChanged(_zoomLevel, false, false); self.zoomChanged(_zoomLevel, false, false);
} }
break; break;
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
{
if (gestureRecognizer.view != self) {
self.zoomChanged(_zoomLevel, true, false);
}
}
break;
default: default:
break; break;
} }
@ -355,23 +364,22 @@
_zoomLevel = zoomLevel; _zoomLevel = zoomLevel;
if (zoomLevel < 1.0) { if (zoomLevel < 1.0) {
NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel];
if ([value isEqual:@"1,0x"]) { value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
if ([value isEqual:@"1,0x"] || [value isEqual:@"1x"]) {
value = @"0,9x"; value = @"0,9x";
} }
value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
[_leftItem setValue:value selected:true animated:animated]; [_leftItem setValue:value selected:true animated:animated];
[_centerItem setValue:@"1" selected:false animated:animated]; [_centerItem setValue:@"1" selected:false animated:animated];
[_rightItem setValue:@"2" selected:false animated:animated]; [_rightItem setValue:@"2" selected:false animated:animated];
} else if (zoomLevel < 2.0) { } else if (zoomLevel < 2.0) {
[_leftItem setValue:@"0,5" selected:false animated:animated]; [_leftItem setValue:@"0,5" selected:false animated:animated];
if ((zoomLevel - 1.0) < 0.1) { if ((zoomLevel - 1.0) < 0.025) {
[_centerItem setValue:@"1x" selected:true animated:animated]; [_centerItem setValue:@"1x" selected:true animated:animated];
} else { } else {
NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel];
value = [value stringByReplacingOccurrencesOfString:@"." withString:@","]; value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
if ([value isEqual:@"1,0x"]) { value = [value stringByReplacingOccurrencesOfString:@",0x" withString:@"x"];
value = @"1x"; if ([value isEqual:@"2x"]) {
} else if ([value isEqual:@"2,0x"]) {
value = @"1,9x"; value = @"1,9x";
} }
[_centerItem setValue:value selected:true animated:animated]; [_centerItem setValue:value selected:true animated:animated];
@ -380,13 +388,9 @@
} else { } else {
[_leftItem setValue:@"0,5" selected:false animated:animated]; [_leftItem setValue:@"0,5" selected:false animated:animated];
CGFloat near = round(zoomLevel); NSString *value = [[NSString stringWithFormat:@"%.1fx", zoomLevel] stringByReplacingOccurrencesOfString:@"." withString:@","];
NSString *value; value = [value stringByReplacingOccurrencesOfString:@",0x" withString:@"x"];
if (ABS(zoomLevel - near) < 0.05) {
value = [NSString stringWithFormat:@"%dx", (int)zoomLevel];
} else {
value = [[NSString stringWithFormat:@"%.1fx", zoomLevel] stringByReplacingOccurrencesOfString:@"." withString:@","];
}
if (_rightItem.superview != nil) { if (_rightItem.superview != nil) {
[_centerItem setValue:@"1" selected:false animated:animated]; [_centerItem setValue:@"1" selected:false animated:animated];
[_rightItem setValue:value selected:true animated:animated]; [_rightItem setValue:value selected:true animated:animated];
@ -429,9 +433,13 @@
- (void)layoutSubviews - (void)layoutSubviews
{ {
if (_rightItem.superview == nil) { if (_leftItem.superview == nil && _rightItem.superview == nil) {
_backgroundView.frame = CGRectMake(43, 0, 43, 43); _backgroundView.frame = CGRectMake(43, 0, 43, 43);
} else if (_leftItem.superview == nil) { } else if (_leftItem.superview != nil && _rightItem.superview == nil) {
_backgroundView.frame = CGRectMake(21 + TGScreenPixel, 0, 86, 43);
_leftItem.frame = CGRectMake(21 + TGScreenPixel, 0, 43, 43);
_centerItem.frame = CGRectMake(21 + TGScreenPixel + 43, 0, 43, 43);
} else if (_leftItem.superview == nil && _rightItem.superview != nil) {
_backgroundView.frame = CGRectMake(21 + TGScreenPixel, 0, 86, 43); _backgroundView.frame = CGRectMake(21 + TGScreenPixel, 0, 86, 43);
_centerItem.frame = CGRectMake(21 + TGScreenPixel, 0, 43, 43); _centerItem.frame = CGRectMake(21 + TGScreenPixel, 0, 43, 43);
_rightItem.frame = CGRectMake(21 + TGScreenPixel + 43, 0, 43, 43); _rightItem.frame = CGRectMake(21 + TGScreenPixel + 43, 0, 43, 43);
@ -468,6 +476,10 @@
UILabel *_1Label; UILabel *_1Label;
UILabel *_2Label; UILabel *_2Label;
UILabel *_8Label; UILabel *_8Label;
UIPanGestureRecognizer *_gestureRecognizer;
UISelectionFeedbackGenerator *_feedbackGenerator;
} }
@end @end
@ -589,6 +601,10 @@
{ {
TGIsRetina(); TGIsRetina();
if (iosMajorVersion() >= 10) {
_feedbackGenerator = [[UISelectionFeedbackGenerator alloc] init];
}
_hasUltrawideCamera = hasUltrawideCamera; _hasUltrawideCamera = hasUltrawideCamera;
_hasTelephotoCamera = hasTelephotoCamera; _hasTelephotoCamera = hasTelephotoCamera;
@ -600,7 +616,7 @@
CGFloat mediumWidth = smallWidth; CGFloat mediumWidth = smallWidth;
CGFloat bigWidth = 1.0; CGFloat bigWidth = 1.0;
_backgroundView = [[UIImageView alloc] initWithImage:TGCircleImage(side, [UIColor colorWithWhite:0.0 alpha:0.75])]; _backgroundView = [[UIImageView alloc] initWithImage:TGCircleImage(side, [UIColor colorWithWhite:0.0 alpha:0.5])];
_backgroundView.frame = CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, side); _backgroundView.frame = CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, side);
[self addSubview:_backgroundView]; [self addSubview:_backgroundView];
@ -642,6 +658,7 @@
UIGraphicsEndImageContext(); UIGraphicsEndImageContext();
_containerView = [[UIView alloc] initWithFrame:CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, frame.size.height)]; _containerView = [[UIView alloc] initWithFrame:CGRectMake(TGScreenPixelFloor((frame.size.width - side) / 2.0), 0.0, side, frame.size.height)];
_containerView.userInteractionEnabled = false;
[self addSubview:_containerView]; [self addSubview:_containerView];
UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, frame.size.height), false, 0.0f); UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, frame.size.height), false, 0.0f);
@ -659,7 +676,7 @@
CGContextFillPath(context); CGContextFillPath(context);
CGContextFillRect(context, CGRectMake(side / 2.0 - 1.0, 20, 2.0, 7.0)); 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)); CGContextFillEllipseInRect(context, CGRectMake(side / 2.0 - 17.0, 21.0, 34.0, 34.0));
UIImage *maskImage = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:25 topCapHeight:25]; UIImage *maskImage = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:25 topCapHeight:25];
UIGraphicsEndImageContext(); UIGraphicsEndImageContext();
@ -688,11 +705,13 @@
_arrowView = [[UIImageView alloc] initWithFrame:CGRectMake(floor((frame.size.width - 4) / 2.0), 4, 4, 10)]; _arrowView = [[UIImageView alloc] initWithFrame:CGRectMake(floor((frame.size.width - 4) / 2.0), 4, 4, 10)];
_arrowView.image = arrowImage; _arrowView.image = arrowImage;
_arrowView.userInteractionEnabled = false;
[self addSubview:_arrowView]; [self addSubview:_arrowView];
_valueLabel = [[UILabel alloc] init]; _valueLabel = [[UILabel alloc] init];
_valueLabel.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; _valueLabel.font = [TGCameraInterfaceAssets boldFontOfSize:13.0];
_valueLabel.textColor = [TGCameraInterfaceAssets accentColor]; _valueLabel.textColor = [TGCameraInterfaceAssets accentColor];
_valueLabel.userInteractionEnabled = false;
[self addSubview:_valueLabel]; [self addSubview:_valueLabel];
CGFloat radius = side / 2.0; CGFloat radius = side / 2.0;
@ -718,7 +737,7 @@
if (_hasTelephotoCamera) { if (_hasTelephotoCamera) {
_2Label = [[UILabel alloc] init]; _2Label = [[UILabel alloc] init];
_2Label.text = @"2,0"; _2Label.text = @"2";
_2Label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0]; _2Label.font = [TGCameraInterfaceAssets boldFontOfSize:13.0];
_2Label.textColor = [UIColor whiteColor]; _2Label.textColor = [UIColor whiteColor];
[_2Label sizeToFit]; [_2Label sizeToFit];
@ -737,11 +756,25 @@
_8Label.center = CGPointMake(radius - sin(TGDegreesToRadians(-58.93)) * (radius - 38.0), radius - cos(TGDegreesToRadians(-58.93)) * (radius - 38.0)); _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)); _8Label.transform = CGAffineTransformMakeRotation(TGDegreesToRadians(58.93));
_gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
[self addGestureRecognizer:_gestureRecognizer];
} }
return self; return self;
} }
- (void)panGesture:(UIPanGestureRecognizer *)gestureRecognizer {
if (self.panGesture != nil) {
self.panGesture(gestureRecognizer);
}
}
- (void)setZoomLevel:(CGFloat)zoomLevel { - (void)setZoomLevel:(CGFloat)zoomLevel {
[self setZoomLevel:zoomLevel panning:false];
}
- (void)setZoomLevel:(CGFloat)zoomLevel panning:(bool)panning {
zoomLevel = MAX(0.5, zoomLevel); zoomLevel = MAX(0.5, zoomLevel);
_zoomLevel = zoomLevel; _zoomLevel = zoomLevel;
@ -760,14 +793,19 @@
break; break;
} }
if (previous != nil && zoomLevel < value) { if (previous != nil && zoomLevel <= value) {
CGFloat previousValue = [previous[0] floatValue]; if (zoomLevel == value) {
CGFloat previousAngle = [previous[1] floatValue]; finalAngle = angle;
if (zoomLevel > previousValue) {
CGFloat factor = (zoomLevel - previousValue) / (value - previousValue);
finalAngle = previousAngle + (angle - previousAngle) * factor;
break; break;
} else {
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; previous = values;
@ -776,15 +814,18 @@
_scaleView.transform = CGAffineTransformMakeRotation(finalAngle); _scaleView.transform = CGAffineTransformMakeRotation(finalAngle);
CGFloat near = round(zoomLevel);
NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel];
value = [value stringByReplacingOccurrencesOfString:@"." withString:@","]; value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
if (ABS(zoomLevel - near) < 0.05) { value = [value stringByReplacingOccurrencesOfString:@",0x" withString:@"x"];
value = [NSString stringWithFormat:@"%dx", (int)near];
} NSString *previousValue = _valueLabel.text;
_valueLabel.text = value; _valueLabel.text = value;
[_valueLabel sizeToFit]; [_valueLabel sizeToFit];
if (panning && ![previousValue isEqualToString:value] && ([value isEqualToString:@"0,5x"] || ![value containsString:@","])) {
[_feedbackGenerator selectionChanged];
}
_valueLabel.frame = CGRectMake(TGScreenPixelFloor((self.frame.size.width - _valueLabel.frame.size.width) / 2.0), 30.0, _valueLabel.frame.size.width, _valueLabel.frame.size.height); _valueLabel.frame = CGRectMake(TGScreenPixelFloor((self.frame.size.width - _valueLabel.frame.size.width) / 2.0), 30.0, _valueLabel.frame.size.width, _valueLabel.frame.size.height);
} }