2020-02-22 15:38:54 +04:00

126 lines
5.0 KiB
Objective-C

#import "TGLocationPinView.h"
#import "TGImageUtils.h"
#import "LegacyComponentsInternal.h"
#import "TGLocationMapViewController.h"
const CGSize TGLocationPinSize = { 13.5f, 36 };
const CGFloat TGLocationPinDamping = 2.0f;
const CGFloat TGLocationPinPinnedOrigin = 47;
const CGFloat TGLocationPinRaisedOrigin = 7;
const CGPoint TGLocationPinShadowPinnedOrigin = { 43, 47 };
const CGPoint TGLocationPinShadowRaisedOrigin = { 87, -33 };
@interface TGLocationPinView ()
{
UIImageView *_pinView;
UIImageView *_pinPointView;
UIImageView *_shadowView;
}
@end
@implementation TGLocationPinView
- (instancetype)init
{
self = [super initWithFrame:CGRectMake(0, 0, 100, 100)];
if (self != nil)
{
self.userInteractionEnabled = false;
_shadowView = [[UIImageView alloc] initWithFrame:CGRectMake(43, 47, 32, 39)];
_shadowView.alpha = 0.9f;
_shadowView.image = TGComponentsImageNamed(@"LocationPinShadow.png");
[self addSubview:_shadowView];
_pinPointView = [[UIImageView alloc] initWithFrame:CGRectMake(CGFloor(self.frame.size.width / 2 - 2), self.frame.size.height - 18.5f, 3.5f, 1.5f)];
_pinPointView.image = TGComponentsImageNamed(@"LocationPinPoint.png");
[self addSubview:_pinPointView];
_pinView = [[UIImageView alloc] initWithFrame:CGRectMake(CGFloor(self.frame.size.width / 2 - 7), 47, 13.5f, 36)];
_pinView.image = TGComponentsImageNamed(@"LocationPin.png");
[self addSubview:_pinView];
}
return self;
}
- (void)setPallete:(TGLocationPallete *)pallete
{
_pallete = pallete;
_pinView.image = TGTintedImage(_pinView.image, pallete.locationColor);
_pinPointView.image = TGTintedImage(_pinPointView.image, pallete.locationColor);
}
- (void)setPinRaised:(bool)pinRaised
{
[self setPinRaised:pinRaised animated:false completion:nil];
}
- (void)setPinRaised:(bool)raised animated:(bool)animated completion:(void (^)(void))completion
{
_pinRaised = raised;
[_pinView.layer removeAllAnimations];
[_shadowView.layer removeAllAnimations];
if (animated)
{
if (raised)
{
[UIView animateWithDuration:0.2f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^
{
_pinView.frame = CGRectMake(_pinView.frame.origin.x, TGLocationPinRaisedOrigin, TGLocationPinSize.width, TGLocationPinSize.height);
_shadowView.frame = CGRectMake(TGLocationPinShadowRaisedOrigin.x, TGLocationPinShadowRaisedOrigin.y, _shadowView.frame.size.width, _shadowView.frame.size.height);
} completion:^(BOOL finished)
{
if (finished && completion != nil)
completion();
}];
}
else
{
[UIView animateWithDuration:0.2f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^
{
_pinView.frame = CGRectMake(_pinView.frame.origin.x, TGLocationPinPinnedOrigin, TGLocationPinSize.width, TGLocationPinSize.height);
_shadowView.frame = CGRectMake(TGLocationPinShadowPinnedOrigin.x, TGLocationPinShadowPinnedOrigin.y, _shadowView.frame.size.width, _shadowView.frame.size.height);
} completion:^(BOOL finished)
{
if (finished)
{
[UIView animateWithDuration:0.1f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^
{
_pinView.frame = CGRectMake(_pinView.frame.origin.x, TGLocationPinPinnedOrigin + TGLocationPinDamping, TGLocationPinSize.width, TGLocationPinSize.height - TGLocationPinDamping);
} completion:^(BOOL finished)
{
if (finished)
{
[UIView animateWithDuration:0.1f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^
{
_pinView.frame = CGRectMake(_pinView.frame.origin.x, TGLocationPinPinnedOrigin, TGLocationPinSize.width, TGLocationPinSize.height);
} completion:^(BOOL finished)
{
if (finished && completion != nil)
completion();
}];
}
}];
}
}];
}
}
else
{
_pinView.frame = CGRectMake(_pinView.frame.origin.x, raised ? TGLocationPinRaisedOrigin : TGLocationPinPinnedOrigin, TGLocationPinSize.width, TGLocationPinSize.height);
CGPoint shadowOrigin = raised ? TGLocationPinShadowRaisedOrigin : TGLocationPinShadowPinnedOrigin;
_shadowView.frame = CGRectMake(shadowOrigin.x, shadowOrigin.y, _shadowView.frame.size.width, _shadowView.frame.size.height);
if (completion != nil)
completion();
}
}
@end