mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-20 04:24:41 +00:00
209 lines
7.8 KiB
Objective-C
209 lines
7.8 KiB
Objective-C
#import "TGLocationPinAnnotationView.h"
|
|
|
|
#import "LegacyComponentsInternal.h"
|
|
#import "TGFont.h"
|
|
|
|
#import "TGLocationAnnotation.h"
|
|
|
|
NSString *const TGLocationPinAnnotationKind = @"TGLocationPinAnnotation";
|
|
|
|
NSString *const TGLocationETAKey = @"eta";
|
|
|
|
@interface TGLocationPinAnnotationView ()
|
|
{
|
|
UIButton *_drivingButton;
|
|
UIImageView *_drivingIconView;
|
|
UILabel *_drivingEtaLabel;
|
|
|
|
UIImageView *_accessoryView;
|
|
}
|
|
@end
|
|
|
|
@implementation TGLocationPinAnnotationView
|
|
|
|
- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
|
|
{
|
|
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
|
|
if (self != nil)
|
|
{
|
|
self.exclusiveTouch = true;
|
|
|
|
_titleLabel.font = TGSystemFontOfSize(15.5f);
|
|
_titleLabel.text = annotation.title;
|
|
_titleLabel.textColor = [UIColor blackColor];
|
|
|
|
_subtitleLabel.font = TGSystemFontOfSize(12.5f);
|
|
_subtitleLabel.textColor = UIColorRGB(0x2289e8);
|
|
|
|
_drivingButton = [[UIButton alloc] init];
|
|
_drivingButton.adjustsImageWhenHighlighted = false;
|
|
_drivingButton.exclusiveTouch = true;
|
|
[_drivingButton setBackgroundImage:[TGComponentsImageNamed(@"CalloutDrivingBackground.png") resizableImageWithCapInsets:UIEdgeInsetsMake(8, 8, 8, 1)] forState:UIControlStateNormal];
|
|
[_drivingButton setBackgroundImage:[TGComponentsImageNamed(@"CalloutDrivingBackground_Highlighted.png") resizableImageWithCapInsets:UIEdgeInsetsMake(8, 8, 8, 1)] forState:UIControlStateHighlighted];
|
|
[_drivingButton addTarget:self action:@selector(drivingButtonPressed) forControlEvents:UIControlEventTouchUpInside];
|
|
[_calloutWrapper addSubview:_drivingButton];
|
|
|
|
_drivingIconView = [[UIImageView alloc] initWithFrame:CGRectMake(11, 16, 22, 15)];
|
|
_drivingIconView.image = TGComponentsImageNamed(@"CalloutDrivingIcon.png");
|
|
[_drivingButton addSubview:_drivingIconView];
|
|
|
|
_drivingEtaLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 44, 15)];
|
|
_drivingEtaLabel.backgroundColor = [UIColor clearColor];
|
|
_drivingEtaLabel.numberOfLines = 1;
|
|
_drivingEtaLabel.minimumScaleFactor = 8.0f / 11.0f;
|
|
_drivingEtaLabel.textColor = [UIColor whiteColor];
|
|
_drivingEtaLabel.textAlignment = NSTextAlignmentCenter;
|
|
_drivingEtaLabel.adjustsFontSizeToFitWidth = true;
|
|
[_drivingButton addSubview:_drivingEtaLabel];
|
|
|
|
_accessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 9, 14)];
|
|
_accessoryView.image = TGComponentsImageNamed(@"CalloutAccessory");
|
|
[_calloutWrapper addSubview:_accessoryView];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)setAnnotation:(id<MKAnnotation>)annotation
|
|
{
|
|
[super setAnnotation:annotation];
|
|
|
|
_titleLabel.text = annotation.title;
|
|
_subtitleLabel.text = annotation.subtitle;
|
|
|
|
if ([annotation isKindOfClass:[TGLocationAnnotation class]])
|
|
{
|
|
TGLocationAnnotation *locationAnnotation = (TGLocationAnnotation *)annotation;
|
|
|
|
NSTimeInterval eta = [locationAnnotation.userInfo[TGLocationETAKey] doubleValue];
|
|
[self setDrivingETA:eta];
|
|
}
|
|
}
|
|
|
|
#pragma mark - Actions
|
|
|
|
- (void)drivingButtonPressed
|
|
{
|
|
if (self.getDirectionsPressed != nil)
|
|
self.getDirectionsPressed();
|
|
}
|
|
|
|
#pragma mark - Properties
|
|
|
|
- (void)setDrivingETA:(NSTimeInterval)drivingETA
|
|
{
|
|
if (drivingETA > 0 && drivingETA < 60 * 60 * 10)
|
|
{
|
|
drivingETA = MAX(drivingETA, 60);
|
|
|
|
NSInteger minutes = (NSInteger)(drivingETA / 60) % 60;
|
|
NSInteger hours = (NSInteger)(drivingETA / 3600.0f);
|
|
|
|
NSString *string = nil;
|
|
|
|
if (hours < 1)
|
|
{
|
|
string = [NSString stringWithFormat:TGLocalized(@"Map.ETAMinutes_any"), [NSString stringWithFormat:@"**%d**", (int)minutes]];
|
|
}
|
|
else
|
|
{
|
|
if (hours == 1 && minutes == 0)
|
|
{
|
|
string = [NSString stringWithFormat:TGLocalized(@"Map.ETAHours_1"), @"**1**"];
|
|
}
|
|
else
|
|
{
|
|
string = [NSString stringWithFormat:TGLocalized(@"Map.ETAHours_any"), [NSString stringWithFormat:@"**%d**:**%02d**", (int)hours, (int)minutes]];
|
|
}
|
|
}
|
|
|
|
NSMutableArray *boldRanges = [[NSMutableArray alloc] init];
|
|
NSMutableString *cleanText = [[NSMutableString alloc] initWithString:string];
|
|
while (true)
|
|
{
|
|
NSRange startRange = [cleanText rangeOfString:@"**"];
|
|
if (startRange.location == NSNotFound)
|
|
break;
|
|
|
|
[cleanText deleteCharactersInRange:startRange];
|
|
|
|
NSRange endRange = [cleanText rangeOfString:@"**"];
|
|
if (endRange.location == NSNotFound)
|
|
break;
|
|
|
|
[cleanText deleteCharactersInRange:endRange];
|
|
|
|
[boldRanges addObject:[NSValue valueWithRange:NSMakeRange(startRange.location, endRange.location - startRange.location)]];
|
|
}
|
|
|
|
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:cleanText];
|
|
[attributedString addAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName: TGSystemFontOfSize(11)} range:NSMakeRange(0, attributedString.length)];
|
|
|
|
NSDictionary *boldAttributes = @{NSFontAttributeName: TGBoldSystemFontOfSize(11)};
|
|
for (NSValue *range in boldRanges)
|
|
[attributedString addAttributes:boldAttributes range:[range rangeValue]];
|
|
|
|
_drivingEtaLabel.attributedText = attributedString;
|
|
}
|
|
else
|
|
{
|
|
_drivingEtaLabel.attributedText = nil;
|
|
}
|
|
}
|
|
|
|
#pragma mark - Layout
|
|
|
|
- (void)sizeToFit
|
|
{
|
|
CGRect frame = _calloutWrapper.frame;
|
|
|
|
CGSize titleLabelSize = [_titleLabel sizeThatFits:CGSizeMake(214, FLT_MAX)];
|
|
CGSize subtitleLabelSize = [_subtitleLabel sizeThatFits:CGSizeMake(214, FLT_MAX)];
|
|
|
|
CGFloat labelsWidth = MAX(titleLabelSize.width, subtitleLabelSize.width) + 86;
|
|
|
|
frame.size.width = MIN(300, MAX(labelsWidth, 194));
|
|
frame.size.height = 46;
|
|
|
|
_calloutWrapper.frame = frame;
|
|
}
|
|
|
|
- (void)layoutSubviews
|
|
{
|
|
_drivingButton.frame = CGRectMake(0.5f, 0.5f, 44, _calloutWrapper.frame.size.height - 1);
|
|
|
|
CGFloat iconViewOriginY = (_drivingButton.frame.size.height - _drivingIconView.frame.size.height) / 2;
|
|
if (_drivingEtaLabel.attributedText.length > 0)
|
|
{
|
|
iconViewOriginY -= 4;
|
|
_drivingEtaLabel.alpha = 1.0f;
|
|
}
|
|
else
|
|
{
|
|
_drivingEtaLabel.alpha = 0.0f;
|
|
}
|
|
_drivingIconView.frame = CGRectMake((_drivingButton.frame.size.width - _drivingIconView.frame.size.width) / 2, iconViewOriginY, _drivingIconView.frame.size.width, _drivingIconView.frame.size.height);
|
|
_drivingEtaLabel.frame = CGRectMake(5, _drivingButton.frame.size.height / 2 + 4, 34, 15);
|
|
|
|
CGFloat titleLabelOriginY = _calloutWrapper.frame.size.height / 2 - 10;
|
|
CGFloat subtitleLabelOriginY = _calloutWrapper.frame.size.height / 2 - 7;
|
|
if (_subtitleLabel.text.length > 0)
|
|
{
|
|
titleLabelOriginY = 5;
|
|
subtitleLabelOriginY = 25;
|
|
_subtitleLabel.alpha = 1.0f;
|
|
}
|
|
else
|
|
{
|
|
_subtitleLabel.alpha = 0.0f;
|
|
}
|
|
|
|
_titleLabel.frame = CGRectMake(_drivingButton.frame.size.width + 12, titleLabelOriginY, _calloutWrapper.frame.size.width - 82, 19);
|
|
_subtitleLabel.frame = CGRectMake(_drivingButton.frame.size.width + 12, subtitleLabelOriginY, _calloutWrapper.frame.size.width - 82, 15);
|
|
|
|
_accessoryView.frame = CGRectMake(_calloutWrapper.frame.size.width - _accessoryView.frame.size.width - 13, (_calloutWrapper.frame.size.height - _accessoryView.frame.size.height) / 2, _accessoryView.frame.size.width, _accessoryView.frame.size.height);
|
|
|
|
[super layoutSubviews];
|
|
}
|
|
|
|
@end
|