1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGCameraSegmentsView.m
2016-02-25 01:03:51 +01:00

258 lines
6.7 KiB
Objective-C

#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