mirror of
https://github.com/danog/Telegram.git
synced 2024-12-02 09:27:55 +01:00
258 lines
6.7 KiB
Mathematica
258 lines
6.7 KiB
Mathematica
|
#import "TGCameraSegmentsView.h"
|
||
|
#import "TGCameraInterfaceAssets.h"
|
||
|
|
||
|
#import "TGImageUtils.h"
|
||
|
#import "TGModernButton.h"
|
||
|
|
||
|
const CGFloat TGCameraSegmentsBackgroundInset = 21.0f;
|
||
|
const CGFloat TGCameraSegmentsBackgroundHeight = 10.0f;
|
||
|
const CGFloat TGCameraSegmentsSpacing = 1.5f;
|
||
|
const CGFloat TGCameraSegmentsMinimumWidth = 4.0f;
|
||
|
|
||
|
@interface TGCameraSegmentView : UIImageView
|
||
|
|
||
|
- (void)setBlinking;
|
||
|
- (void)setRecording;
|
||
|
- (void)setCommittingWithCompletion:(void (^)(void))completion;
|
||
|
|
||
|
@end
|
||
|
|
||
|
@interface TGCameraSegmentsView ()
|
||
|
{
|
||
|
UIImageView *_backgroundView;
|
||
|
UIView *_segmentWrapper;
|
||
|
NSArray *_segmentViews;
|
||
|
|
||
|
TGCameraSegmentView *_currentSegmentView;
|
||
|
CGFloat _currentSegment;
|
||
|
|
||
|
TGModernButton *_deleteButton;
|
||
|
}
|
||
|
@end
|
||
|
|
||
|
@implementation TGCameraSegmentsView
|
||
|
|
||
|
- (instancetype)initWithFrame:(CGRect)frame
|
||
|
{
|
||
|
self = [super initWithFrame:frame];
|
||
|
if (self != nil)
|
||
|
{
|
||
|
static dispatch_once_t onceToken;
|
||
|
static UIImage *segmentImage = nil;
|
||
|
dispatch_once(&onceToken, ^
|
||
|
{
|
||
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(4, 4), false, 0.0f);
|
||
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
||
|
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
|
||
|
[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 4, 4) cornerRadius:0.5f] fill];
|
||
|
segmentImage = [UIGraphicsGetImageFromCurrentImageContext() resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)];
|
||
|
UIGraphicsEndImageContext();
|
||
|
});
|
||
|
|
||
|
_backgroundView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"CameraSegmentsBack"] resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]];
|
||
|
[self addSubview:_backgroundView];
|
||
|
|
||
|
_segmentWrapper = [[UIView alloc] init];
|
||
|
[_backgroundView addSubview:_segmentWrapper];
|
||
|
|
||
|
_currentSegmentView = [[TGCameraSegmentView alloc] initWithImage:[TGTintedImage(segmentImage, [TGCameraInterfaceAssets accentColor]) resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]];
|
||
|
[_segmentWrapper addSubview:_currentSegmentView];
|
||
|
|
||
|
_deleteButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
|
||
|
_deleteButton.exclusiveTouch = true;
|
||
|
[_deleteButton setImage:[UIImage imageNamed:@"CameraDeleteIcon"] forState:UIControlStateNormal];
|
||
|
[_deleteButton addTarget:self action:@selector(deleteButtonPressed) forControlEvents:UIControlEventTouchUpInside];
|
||
|
[self addSubview:_deleteButton];
|
||
|
|
||
|
[self setDeleteButtonHidden:true animated:false];
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)deleteButtonPressed
|
||
|
{
|
||
|
if (self.deletePressed != nil)
|
||
|
self.deletePressed();
|
||
|
}
|
||
|
|
||
|
- (void)setSegments:(NSArray *)segments
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
- (void)startCurrentSegment
|
||
|
{
|
||
|
[_currentSegmentView setRecording];
|
||
|
}
|
||
|
|
||
|
- (void)setCurrentSegment:(CGFloat)length
|
||
|
{
|
||
|
_currentSegment = length;
|
||
|
[self _layoutSegmentViews];
|
||
|
}
|
||
|
|
||
|
- (void)commitCurrentSegmentWithCompletion:(void (^)(void))completion
|
||
|
{
|
||
|
__weak TGCameraSegmentView *weakSegmentView = _currentSegmentView;
|
||
|
[_currentSegmentView setCommittingWithCompletion:^
|
||
|
{
|
||
|
__strong TGCameraSegmentView *strongSegmentView = weakSegmentView;
|
||
|
if (strongSegmentView == nil)
|
||
|
return;
|
||
|
|
||
|
_currentSegment = 0;
|
||
|
|
||
|
if (completion != nil)
|
||
|
completion();
|
||
|
|
||
|
[strongSegmentView setBlinking];
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
- (void)highlightLastSegment
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
- (void)removeLastSegment
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
- (void)setHidden:(BOOL)hidden
|
||
|
{
|
||
|
self.alpha = hidden ? 0.0f : 1.0f;
|
||
|
super.hidden = hidden;
|
||
|
|
||
|
if (!hidden)
|
||
|
[_currentSegmentView setBlinking];
|
||
|
}
|
||
|
|
||
|
- (void)setHidden:(bool)hidden animated:(bool)animated delay:(NSTimeInterval)delay
|
||
|
{
|
||
|
if (animated)
|
||
|
{
|
||
|
super.hidden = false;
|
||
|
|
||
|
[UIView animateWithDuration:0.25f delay:delay options:UIViewAnimationOptionCurveLinear animations:^
|
||
|
{
|
||
|
self.alpha = hidden ? 0.0f : 1.0f;
|
||
|
} completion:^(BOOL finished)
|
||
|
{
|
||
|
if (finished)
|
||
|
self.hidden = hidden;
|
||
|
|
||
|
if (!hidden)
|
||
|
[_currentSegmentView setBlinking];
|
||
|
}];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
[self setHidden:hidden];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void)setDeleteButtonHidden:(bool)hidden animated:(bool)animated
|
||
|
{
|
||
|
if (animated)
|
||
|
{
|
||
|
_deleteButton.hidden = false;
|
||
|
|
||
|
[UIView animateWithDuration:0.25f animations:^
|
||
|
{
|
||
|
_deleteButton.alpha = hidden ? 0.0f : 1.0f;
|
||
|
} completion:^(BOOL finished)
|
||
|
{
|
||
|
if (finished)
|
||
|
_deleteButton.hidden = hidden;
|
||
|
}];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_deleteButton.hidden = hidden;
|
||
|
_deleteButton.alpha = hidden ? 0.0f : 1.0f;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void)_layoutBackgroundView
|
||
|
{
|
||
|
CGFloat backgroundRightPadding = 0.0f;
|
||
|
CGFloat deleteButtonMargin = _deleteButton.frame.size.width + 9.0f;
|
||
|
if (!_deleteButton.hidden)
|
||
|
backgroundRightPadding = deleteButtonMargin;
|
||
|
|
||
|
_backgroundView.frame = CGRectMake(TGCameraSegmentsBackgroundInset, (self.frame.size.height - TGCameraSegmentsBackgroundHeight) / 2, self.frame.size.width - TGCameraSegmentsBackgroundInset * 2 - backgroundRightPadding, TGCameraSegmentsBackgroundHeight);
|
||
|
_segmentWrapper.frame = CGRectMake(3, 3, self.frame.size.width - TGCameraSegmentsBackgroundInset * 2 - deleteButtonMargin, TGCameraSegmentsBackgroundHeight - 3 * 2);
|
||
|
}
|
||
|
|
||
|
- (void)_layoutDeleteButton
|
||
|
{
|
||
|
_deleteButton.frame = CGRectMake(CGRectGetMaxX(_backgroundView.frame) + 14, (self.frame.size.height - _deleteButton.frame.size.height) / 2, _deleteButton.frame.size.width, _deleteButton.frame.size.height);
|
||
|
}
|
||
|
|
||
|
- (void)_layoutSegmentViews
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
- (void)layoutSubviews
|
||
|
{
|
||
|
[self _layoutBackgroundView];
|
||
|
[self _layoutDeleteButton];
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
@interface TGCameraSegmentView ()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
@end
|
||
|
|
||
|
@implementation TGCameraSegmentView
|
||
|
|
||
|
- (instancetype)initWithImage:(UIImage *)image
|
||
|
{
|
||
|
self = [super initWithImage:image];
|
||
|
if (self != nil)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)setBlinking
|
||
|
{
|
||
|
[self _playBlinkAnimation];
|
||
|
}
|
||
|
|
||
|
- (void)setRecording
|
||
|
{
|
||
|
[self _stopBlinkAnimation];
|
||
|
}
|
||
|
|
||
|
- (void)setCommittingWithCompletion:(void (^)(void))completion
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
- (void)_playBlinkAnimation
|
||
|
{
|
||
|
CAKeyframeAnimation *blinkAnim = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
|
||
|
blinkAnim.duration = 1.2f;
|
||
|
blinkAnim.autoreverses = false;
|
||
|
blinkAnim.fillMode = kCAFillModeForwards;
|
||
|
blinkAnim.repeatCount = HUGE_VALF;
|
||
|
blinkAnim.keyTimes = @[ @0.0f, @0.4f, @0.5f, @0.9f, @1.0f ];
|
||
|
blinkAnim.values = @[ @1.0f, @1.0f, @0.0f, @0.0f, @1.0f ];
|
||
|
|
||
|
[self.layer addAnimation:blinkAnim forKey:@"opacity"];
|
||
|
}
|
||
|
|
||
|
- (void)_stopBlinkAnimation
|
||
|
{
|
||
|
[self.layer removeAllAnimations];
|
||
|
}
|
||
|
|
||
|
@end
|