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

305 lines
12 KiB
Objective-C

#import "TGStickerPackPreviewView.h"
#import "TGFont.h"
#import "TGModernButton.h"
#import "TGPagerView.h"
#import "TGStickerPreviewPagingScrollView.h"
#import "TGSingleStickerPreviewWindow.h"
@interface TGStickerPackPreviewView ()
{
TGStickerPack *_stickerPack;
NSString *_actionTitle;
void (^_action)();
UIView *_dimView;
UIImageView *_backgroundView;
UILabel *_titleLabel;
TGModernButton *_dismissButton;
UIButton *_actionButton;
TGPagerView *_pageControl;
TGStickerPreviewPagingScrollView *_pagingView;
TGSingleStickerPreviewWindow *_stickerPreviewWindow;
}
@end
@implementation TGStickerPackPreviewView
- (UIImage *)backgroundImage
{
static UIImage *image = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
CGFloat diameter = 10.0f;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(diameter, diameter), false, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, diameter, diameter));
image = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:(NSInteger)(diameter / 2.0f) topCapHeight:(NSInteger)(diameter / 2.0f)];
UIGraphicsEndImageContext();
});
return image;
}
- (UIImage *)actionButtonImage
{
static UIImage *image = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
CGFloat diameter = 36.0f;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(diameter, diameter), false, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, UIColorRGB(0x4fc953).CGColor);
CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, diameter, diameter));
image = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:(NSInteger)(diameter / 2.0f) topCapHeight:(NSInteger)(diameter / 2.0f)];
UIGraphicsEndImageContext();
});
return image;
}
- (UIImage *)dismissImage
{
static UIImage *image = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
CGSize size = CGSizeMake(13.0f, 13.0f);
UIGraphicsBeginImageContextWithOptions(size, false, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, UIColorRGB(0x9c9d9e).CGColor);
CGFloat lineWidth = 1.4f;
CGFloat lineInset = lineWidth / 2.0f;
CGContextSetLineWidth(context, lineWidth);
CGPoint lineSegments[4] = {
CGPointMake(lineInset, lineInset),
CGPointMake(size.width - lineInset, size.height - lineInset),
CGPointMake(size.width - lineInset, lineInset),
CGPointMake(lineInset, size.height - lineInset)
};
CGContextStrokeLineSegments(context, lineSegments, 4);
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
return image;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self != nil)
{
_dimView = [[UIView alloc] init];
_dimView.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.5f];
[_dimView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dimViewTapped:)]];
[self addSubview:_dimView];
_backgroundView = [[UIImageView alloc] initWithImage:[self backgroundImage]];
_backgroundView.userInteractionEnabled = true;
[self addSubview:_backgroundView];
_titleLabel = [[UILabel alloc] init];
_titleLabel.backgroundColor = [UIColor clearColor];
_titleLabel.textColor = [UIColor blackColor];
_titleLabel.font = TGBoldSystemFontOfSize(16.0f);
[_backgroundView addSubview:_titleLabel];
_pageControl = [[TGPagerView alloc] initWithDotColors:@[UIColorRGB(0xa1a1a1)] dotSize:5.0f];
_pageControl.dotSpacing = 5.0f;
[_pageControl setPage:0.0f];
[_backgroundView addSubview:_pageControl];
_pagingView = [[TGStickerPreviewPagingScrollView alloc] init];
__weak TGStickerPackPreviewView *weakSelf = self;
_pagingView.pageChanged = ^(CGFloat page)
{
__strong TGStickerPackPreviewView *strongSelf = weakSelf;
if (strongSelf != nil)
[strongSelf->_pageControl setPage:page];
};
[_backgroundView addSubview:_pagingView];
UIImage *dismissImage = [self dismissImage];
_dismissButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, dismissImage.size.width + 20.0f, dismissImage.size.height + 20.0f)];
[_dismissButton setImage:dismissImage forState:UIControlStateNormal];
[_dismissButton addTarget:self action:@selector(dismissPressed) forControlEvents:UIControlEventTouchUpInside];
[_backgroundView addSubview:_dismissButton];
_actionButton = [[UIButton alloc] init];
[_actionButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_actionButton.titleLabel.font = TGMediumSystemFontOfSize(14.0f);
[_actionButton setBackgroundImage:[self actionButtonImage] forState:UIControlStateNormal];
_actionButton.hidden = true;
[_actionButton addTarget:self action:@selector(actionPressed) forControlEvents:UIControlEventTouchUpInside];
[_backgroundView addSubview:_actionButton];
_dimView.alpha = 0.0f;
_backgroundView.alpha = 0.0f;
UILongPressGestureRecognizer *tapRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTapGesture:)];
tapRecognizer.minimumPressDuration = 0.25;
[_pagingView addGestureRecognizer:tapRecognizer];
}
return self;
}
- (void)animateAppear
{
_dimView.alpha = 0.0f;
_backgroundView.alpha = 0.0f;
_backgroundView.transform = CGAffineTransformMakeScale(0.94f, 0.94f);
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^
{
_dimView.alpha = 1.0f;
_backgroundView.alpha = 1.0f;
_backgroundView.transform = CGAffineTransformIdentity;
} completion:nil];
}
- (void)animateDismiss:(void (^)())completion
{
[UIView animateWithDuration:0.2 animations:^
{
_dimView.alpha = 0.0f;
_backgroundView.transform = CGAffineTransformMakeScale(0.9f, 0.9f);
_backgroundView.alpha = 0.0f;
} completion:^(__unused BOOL finished)
{
if (completion)
completion();
}];
}
- (void)dismissPressed
{
[self animateDismiss:^
{
if (_dismiss)
_dismiss();
}];
}
- (void)actionPressed
{
if (_action)
_action();
}
- (void)dimViewTapped:(UITapGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateEnded)
{
[self dismissPressed];
}
}
- (void)setStickerPack:(TGStickerPack *)stickerPack
{
_stickerPack = stickerPack;
NSString *title = stickerPack.title;
if ([stickerPack.packReference isKindOfClass:[TGStickerPackBuiltinReference class]])
title = TGLocalized(@"StickerPack.BuiltinPackName");
_titleLabel.text = title;
[_pagingView setStickerPack:stickerPack];
[_pageControl setPagesCount:(int)[_pagingView pageCount]];
[self setNeedsLayout];
}
- (void)setAction:(void (^)())action title:(NSString *)title
{
_action = [action copy];
_actionTitle = title;
[_actionButton setTitle:title forState:UIControlStateNormal];
_actionButton.hidden = _action == nil;
[self setNeedsLayout];
}
- (void)layoutSubviews
{
[super layoutSubviews];
_dimView.frame = CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height);
CGSize titleSize = [_titleLabel.text sizeWithFont:_titleLabel.font];
titleSize.width = MIN(278.0f - 20.0f - 40.0f, titleSize.width);
bool reducedMode = self.frame.size.height < 480.0f- FLT_EPSILON;
CGSize pagingViewSize = CGSizeMake(278.0f, 220.0f);
if (_stickerPack.documents.count < 4)
pagingViewSize.height = 75.0f;
else if (_stickerPack.documents.count < 7)
pagingViewSize.height = 140.0f;
CGSize contentSize = CGSizeMake(278.0f, (reducedMode ? 75.0f : 130.0f) + pagingViewSize.height);
if (_actionButton.hidden)
contentSize.height -= 36.0f;
CGFloat actionAreaHeight = 0.0f;
if (!_actionButton.hidden)
actionAreaHeight = 36.0f + 12.0f;
CGPoint backgroundOrigin = CGPointMake(CGFloor((self.frame.size.width - contentSize.width) / 2.0f), CGFloor((self.frame.size.height - contentSize.height) / 2.0f) + (reducedMode ? 10.0f : 0.0f));
CGPoint contentOrigin = CGPointMake(0.0f, 0.0f);
CGAffineTransform backgroundTransform = _backgroundView.transform;
_backgroundView.transform = CGAffineTransformIdentity;
_backgroundView.frame = CGRectMake(backgroundOrigin.x, backgroundOrigin.y, contentSize.width, contentSize.height);
_backgroundView.transform = backgroundTransform;
CGFloat titleControlsOffset = reducedMode ? -10.0f : 0.0f;
_titleLabel.frame = CGRectMake(contentOrigin.x + 19.0f, contentOrigin.y + 17.0f + titleControlsOffset, titleSize.width, titleSize.height);
_dismissButton.frame = CGRectMake(contentOrigin.x + contentSize.width - 10.0f - _dismissButton.frame.size.width, contentOrigin.y + 10.0f + titleControlsOffset, _dismissButton.frame.size.width, _dismissButton.frame.size.height);
_pageControl.alpha = (reducedMode || [_pagingView pageCount] == 1) ? 0.0f : 1.0f;
[_pageControl sizeToFit];
_pageControl.frame = CGRectMake(contentOrigin.x + CGFloor((contentSize.width - _pageControl.frame.size.width) / 2.0f), contentOrigin.y + contentSize.height - actionAreaHeight - 14.0f - _pageControl.frame.size.height, _pageControl.frame.size.width, _pageControl.frame.size.height);
CGFloat pagingViewOffset = reducedMode ? -14.0f : 0.0f;
_pagingView.frame = CGRectMake(contentOrigin.x + CGFloor((contentSize.width - pagingViewSize.width) / 2.0f), contentOrigin.y + 56.0f + titleControlsOffset + pagingViewOffset, pagingViewSize.width, pagingViewSize.height);
if (!_actionButton.hidden)
{
[_actionButton sizeToFit];
CGFloat actionButtonPadding = 18.0f;
_actionButton.frame = CGRectMake(contentOrigin.x + CGFloor((contentSize.width - _actionButton.frame.size.width - actionButtonPadding * 2.0f) / 2.0f), contentOrigin.y + contentSize.height - (reducedMode ? 4.0f : 14.0f) - 36.0f, _actionButton.frame.size.width + actionButtonPadding * 2.0f, 36.0f);
}
}
- (void)longTapGesture:(UILongPressGestureRecognizer *)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
_stickerPreviewWindow.hidden = true;
__strong TGViewController *controller = _controller;
TGDocumentMediaAttachment *document = [_pagingView documentAtPoint:[recognizer locationInView:_pagingView]];
if (document != nil && controller != nil) {
_stickerPreviewWindow = [[TGSingleStickerPreviewWindow alloc] initWithParentController:controller];
_stickerPreviewWindow.userInteractionEnabled = false;
[_stickerPreviewWindow.view setDocument:document];
_stickerPreviewWindow.hidden = false;
}
} else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled)
{
__weak UIWindow *weakWindow = _stickerPreviewWindow;
[_stickerPreviewWindow.view animateDismiss:^{
__strong UIWindow *strongWindow = weakWindow;
strongWindow.hidden = true;
}];
_stickerPreviewWindow = nil;
}
}
@end