Merge pull request #4247 from igrechuhin/MAPSME-2235

[ios] Updated UI to support route altitude images.
This commit is contained in:
Vlad Mihaylenko 2016-09-09 14:32:54 +03:00 committed by GitHub
commit 16a2be0f43
32 changed files with 621 additions and 551 deletions

View file

@ -4,6 +4,7 @@ typedef NS_ENUM(NSUInteger, MWMButtonColoring)
MWMButtonColoringBlue,
MWMButtonColoringBlack,
MWMButtonColoringWhite,
MWMButtonColoringWhiteText,
MWMButtonColoringGray
};

View file

@ -76,6 +76,9 @@ namespace
case MWMButtonColoringGray:
self.tintColor = [UIColor blackDividers];
break;
case MWMButtonColoringWhiteText:
self.tintColor = [UIColor whitePrimaryTextHighlighted];
break;
case MWMButtonColoringWhite:
case MWMButtonColoringOther:
break;
@ -103,6 +106,7 @@ namespace
self.tintColor = [UIColor linkBlue];
break;
case MWMButtonColoringWhite:
case MWMButtonColoringWhiteText:
case MWMButtonColoringBlue:
case MWMButtonColoringOther:
case MWMButtonColoringGray:
@ -125,6 +129,9 @@ namespace
case MWMButtonColoringWhite:
self.tintColor = [UIColor white];
break;
case MWMButtonColoringWhiteText:
self.tintColor = [UIColor whitePrimaryText];
break;
case MWMButtonColoringBlue:
self.tintColor = [UIColor linkBlue];
break;
@ -145,6 +152,8 @@ namespace
self.coloring = MWMButtonColoringBlack;
else if ([coloring isEqualToString:@"MWMWhite"])
self.coloring = MWMButtonColoringWhite;
else if ([coloring isEqualToString:@"MWMWhiteText"])
self.coloring = MWMButtonColoringWhiteText;
else if ([coloring isEqualToString:@"MWMOther"])
self.coloring = MWMButtonColoringOther;
else if ([coloring isEqualToString:@"MWMGray"])

View file

@ -1,9 +1,9 @@
#import "MWMButton.h"
#import "UIImageView+Coloring.h"
#include "std/vector.hpp"
typedef NS_ENUM(NSInteger, MWMCircularProgressState)
{
typedef NS_ENUM(NSInteger, MWMCircularProgressState) {
MWMCircularProgressStateNormal,
MWMCircularProgressStateSelected,
MWMCircularProgressStateProgress,
@ -16,7 +16,7 @@ using MWMCircularProgressStateVec = vector<MWMCircularProgressState>;
@class MWMCircularProgress;
@protocol MWMCircularProgressProtocol <NSObject>
@protocol MWMCircularProgressProtocol<NSObject>
- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress;
@ -26,13 +26,16 @@ using MWMCircularProgressStateVec = vector<MWMCircularProgressState>;
+ (nonnull instancetype)downloaderProgressForParentView:(nonnull UIView *)parentView;
@property (nonatomic) CGFloat progress;
@property (nonatomic) MWMCircularProgressState state;
@property (weak, nonatomic) id<MWMCircularProgressProtocol> _Nullable delegate;
@property(nonatomic) CGFloat progress;
@property(nonatomic) MWMCircularProgressState state;
@property(weak, nonatomic) id<MWMCircularProgressProtocol> _Nullable delegate;
- (void)setSpinnerColoring:(MWMImageColoring)coloring;
- (void)setSpinnerBackgroundColor:(nonnull UIColor *)backgroundColor;
- (void)setImage:(nonnull UIImage *)image forStates:(MWMCircularProgressStateVec const &)states;
- (void)setColor:(nonnull UIColor *)color forStates:(MWMCircularProgressStateVec const &)states;
- (void)setColoring:(MWMButtonColoring)coloring forStates:(MWMCircularProgressStateVec const &)states;
- (void)setColoring:(MWMButtonColoring)coloring
forStates:(MWMCircularProgressStateVec const &)states;
- (void)setInvertColor:(BOOL)invertColor;
- (nonnull instancetype)init __attribute__((unavailable("init is not available")));

View file

@ -3,19 +3,20 @@
namespace
{
UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bundle:[NSBundle mainBundle]];
} // namespace
UINib * const progressViewNib =
[UINib nibWithNibName:@"MWMCircularProgress" bundle:[NSBundle mainBundle]];
} // namespace
@interface MWMCircularProgressView ()
@property (nonatomic) BOOL suspendRefreshProgress;
@property(nonatomic) BOOL suspendRefreshProgress;
@end
@interface MWMCircularProgress ()
@property (nonatomic) IBOutlet MWMCircularProgressView * rootView;
@property (nonatomic) NSNumber * nextProgressToAnimate;
@property(nonatomic) IBOutlet MWMCircularProgressView * rootView;
@property(nonatomic) NSNumber * nextProgressToAnimate;
@end
@ -60,11 +61,7 @@ UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bun
return self;
}
- (void)dealloc
{
[self.rootView removeFromSuperview];
}
- (void)dealloc { [self.rootView removeFromSuperview]; }
- (void)reset
{
_progress = 0.;
@ -72,6 +69,16 @@ UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bun
self.nextProgressToAnimate = nil;
}
- (void)setSpinnerColoring:(MWMImageColoring)coloring
{
[self.rootView setSpinnerColoring:coloring];
}
- (void)setSpinnerBackgroundColor:(nonnull UIColor *)backgroundColor
{
[self.rootView setSpinnerBackgroundColor:backgroundColor];
}
- (void)setImage:(nonnull UIImage *)image forStates:(MWMCircularProgressStateVec const &)states
{
for (auto const & state : states)
@ -84,17 +91,14 @@ UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bun
[self.rootView setColor:color forState:state];
}
- (void)setColoring:(MWMButtonColoring)coloring forStates:(MWMCircularProgressStateVec const &)states
- (void)setColoring:(MWMButtonColoring)coloring
forStates:(MWMCircularProgressStateVec const &)states
{
for (auto const & state : states)
[self.rootView setColoring:coloring forState:state];
}
- (void)setInvertColor:(BOOL)invertColor
{
self.rootView.isInvertColor = invertColor;
}
- (void)setInvertColor:(BOOL)invertColor { self.rootView.isInvertColor = invertColor; }
#pragma mark - Animation
- (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag
@ -108,11 +112,7 @@ UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bun
#pragma mark - Actions
- (IBAction)buttonTouchUpInside:(UIButton *)sender
{
[self.delegate progressButtonPressed:self];
}
- (IBAction)buttonTouchUpInside:(UIButton *)sender { [self.delegate progressButtonPressed:self]; }
#pragma mark - Properties
- (void)setProgress:(CGFloat)progress
@ -130,8 +130,7 @@ UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bun
}
else
{
dispatch_async(dispatch_get_main_queue(), ^
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.rootView animateFromValue:self->_progress toValue:progress];
self->_progress = progress;
});
@ -140,16 +139,11 @@ UINib * const progressViewNib = [UINib nibWithNibName:@"MWMCircularProgress" bun
- (void)setState:(MWMCircularProgressState)state
{
dispatch_async(dispatch_get_main_queue(), ^
{
dispatch_async(dispatch_get_main_queue(), ^{
[self reset];
self.rootView.state = state;
});
}
- (MWMCircularProgressState)state
{
return self.rootView.state;
}
- (MWMCircularProgressState)state { return self.rootView.state; }
@end

View file

@ -1,15 +1,19 @@
#import "MWMButton.h"
#import "MWMCircularProgress.h"
@interface MWMCircularProgressView : UIView
@property (nonatomic, readonly) BOOL animating;
@property(nonatomic, readonly) BOOL animating;
@property (nonatomic) MWMCircularProgressState state;
@property (nonatomic) BOOL isInvertColor;
@property(nonatomic) MWMCircularProgressState state;
@property(nonatomic) BOOL isInvertColor;
- (nonnull instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
- (nonnull instancetype)initWithFrame:(CGRect)frame
__attribute__((unavailable("initWithFrame is not available")));
- (nonnull instancetype)init __attribute__((unavailable("init is not available")));
- (void)setSpinnerColoring:(MWMImageColoring)coloring;
- (void)setSpinnerBackgroundColor:(nonnull UIColor *)backgroundColor;
- (void)setImage:(nonnull UIImage *)image forState:(MWMCircularProgressState)state;
- (void)setColor:(nonnull UIColor *)color forState:(MWMCircularProgressState)state;
- (void)setColoring:(MWMButtonColoring)coloring forState:(MWMCircularProgressState)state;

View file

@ -1,35 +1,33 @@
#import "Common.h"
#import "MWMCircularProgress.h"
#import "MWMCircularProgressView.h"
#import "Common.h"
#import "UIColor+MapsMeColor.h"
#import "UIImageView+Coloring.h"
#include "std/map.hpp"
static CGFloat const kLineWidth = 2.0;
static NSString * const kAnimationKey = @"CircleAnimation";
static inline CGFloat angleWithProgress(CGFloat progress)
namespace
{
return 2.0 * M_PI * progress - M_PI_2;
}
CGFloat const kLineWidth = 2.0;
NSString * const kAnimationKey = @"CircleAnimation";
CGFloat angleWithProgress(CGFloat progress) { return 2.0 * M_PI * progress - M_PI_2; }
} // namespace
@interface MWMCircularProgressView ()
@property (nonatomic) CAShapeLayer * backgroundLayer;
@property (nonatomic) CAShapeLayer * progressLayer;
@property(nonatomic) CAShapeLayer * backgroundLayer;
@property(nonatomic) CAShapeLayer * progressLayer;
@property (nonatomic, readonly) CGColorRef backgroundLayerColor;
@property (nonatomic, readonly) CGColorRef progressLayerColor;
@property(nonatomic) UIColor * spinnerBackgroundColor;
@property(nonatomic, readonly) CGColorRef progressLayerColor;
@property (nonatomic) NSMutableDictionary * images;
@property (nonatomic) NSMutableDictionary * colors;
@property(nonatomic) NSMutableDictionary * images;
@property(nonatomic) NSMutableDictionary * colors;
@property (weak, nonatomic) IBOutlet MWMCircularProgress * owner;
@property (weak, nonatomic) IBOutlet UIImageView * spinner;
@property (weak, nonatomic) IBOutlet MWMButton * button;
@property(weak, nonatomic) IBOutlet MWMCircularProgress * owner;
@property(weak, nonatomic) IBOutlet UIImageView * spinner;
@property(weak, nonatomic) IBOutlet MWMButton * button;
@property (nonatomic) BOOL suspendRefreshProgress;
@property(nonatomic) BOOL suspendRefreshProgress;
@end
@ -59,9 +57,11 @@ static inline CGFloat angleWithProgress(CGFloat progress)
- (void)setupColors
{
self.colors = [NSMutableDictionary dictionary];
self.spinner.mwm_coloring = MWMImageColoringGray;
UIColor * progressColor = [UIColor linkBlue];
UIColor * progressColor = [_spinnerBackgroundColor isEqual:[UIColor clearColor]]
? [UIColor whiteColor]
: [UIColor linkBlue];
UIColor * clearColor = [UIColor clearColor];
[self setSpinnerColoring:MWMImageColoringGray];
[self setColor:clearColor forState:MWMCircularProgressStateNormal];
[self setColor:clearColor forState:MWMCircularProgressStateSelected];
[self setColor:progressColor forState:MWMCircularProgressStateProgress];
@ -97,6 +97,7 @@ static inline CGFloat angleWithProgress(CGFloat progress)
[self.layer addSublayer:self.progressLayer];
}
- (void)setSpinnerColoring:(MWMImageColoring)coloring { self.spinner.mwm_coloring = coloring; }
- (void)setImage:(nonnull UIImage *)image forState:(MWMCircularProgressState)state
{
self.images[@(state)] = image;
@ -123,7 +124,7 @@ static inline CGFloat angleWithProgress(CGFloat progress)
return;
self.backgroundLayer.fillColor = self.progressLayer.fillColor = UIColor.clearColor.CGColor;
self.backgroundLayer.lineWidth = self.progressLayer.lineWidth = kLineWidth;
self.backgroundLayer.strokeColor = self.backgroundLayerColor;
self.backgroundLayer.strokeColor = self.spinnerBackgroundColor.CGColor;
self.progressLayer.strokeColor = self.progressLayerColor;
CGRect rect = CGRectInset(self.bounds, kLineWidth, kLineWidth);
self.backgroundLayer.path = [UIBezierPath bezierPathWithOvalInRect:rect].CGPath;
@ -135,7 +136,8 @@ static inline CGFloat angleWithProgress(CGFloat progress)
{
if (progress > 0.0)
{
self.state = progress < 1.0 ? MWMCircularProgressStateProgress : MWMCircularProgressStateCompleted;
self.state =
progress < 1.0 ? MWMCircularProgressStateProgress : MWMCircularProgressStateCompleted;
[self stopSpinner];
}
CGFloat const outerRadius = self.width / 2.0;
@ -160,9 +162,14 @@ static inline CGFloat angleWithProgress(CGFloat progress)
}
NSUInteger const animationImagesCount = 12;
NSMutableArray * animationImages = [NSMutableArray arrayWithCapacity:animationImagesCount];
NSString * postfix = ([UIColor isNightMode] && !self.isInvertColor) || (![UIColor isNightMode] && self.isInvertColor) ? @"dark" : @"light";
NSString * postfix = ([UIColor isNightMode] && !self.isInvertColor) ||
(![UIColor isNightMode] && self.isInvertColor) ||
_spinnerBackgroundColor
? @"dark"
: @"light";
for (NSUInteger i = 0; i < animationImagesCount; ++i)
animationImages[i] = [UIImage imageNamed:[NSString stringWithFormat:@"Spinner_%@_%@", @(i+1), postfix]];
animationImages[i] =
[UIImage imageNamed:[NSString stringWithFormat:@"Spinner_%@_%@", @(i + 1), postfix]];
self.spinner.animationDuration = 0.8;
self.spinner.animationImages = animationImages;
@ -188,7 +195,8 @@ static inline CGFloat angleWithProgress(CGFloat progress)
animation.repeatCount = 1;
animation.fromValue = @(fromValue / toValue);
animation.toValue = @1;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.timingFunction =
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.delegate = self.owner;
[self.progressLayer addAnimation:animation forKey:kAnimationKey];
}
@ -207,14 +215,14 @@ static inline CGFloat angleWithProgress(CGFloat progress)
[self refreshProgress];
}
- (CGColorRef)backgroundLayerColor
- (UIColor *)spinnerBackgroundColor
{
if (_spinnerBackgroundColor)
return _spinnerBackgroundColor;
switch (self.state)
{
case MWMCircularProgressStateProgress:
return [UIColor pressBackground].CGColor;
default:
return [UIColor clearColor].CGColor;
case MWMCircularProgressStateProgress: return [UIColor pressBackground];
default: return [UIColor clearColor];
}
}
@ -232,11 +240,7 @@ static inline CGFloat angleWithProgress(CGFloat progress)
[self refreshProgress];
}
- (BOOL)animating
{
return [self.progressLayer animationForKey:kAnimationKey] != nil;
}
- (BOOL)animating { return [self.progressLayer animationForKey:kAnimationKey] != nil; }
- (void)setSuspendRefreshProgress:(BOOL)suspendRefreshProgress
{
_suspendRefreshProgress = suspendRefreshProgress;

View file

@ -3,6 +3,7 @@
#import "EAGLView.h"
#import "MWMBottomMenuViewController.h"
#import "MWMButton.h"
#import "MWMRouter.h"
#import "MapsAppDelegate.h"
#import "UIButton+RuntimeAttributes.h"
#import "UIColor+MapsMeColor.h"
@ -17,6 +18,8 @@ namespace
{
CGFloat constexpr kAdditionalHeight = 64;
CGFloat constexpr kDefaultMainButtonsHeight = 48;
CGFloat constexpr kBicyclePlanningMainButtonsHeightLandscape = 62;
CGFloat constexpr kBicyclePlanningMainButtonsHeightRegular = 94;
CGFloat constexpr kDefaultMenuButtonWidth = 60;
CGFloat constexpr kRoutingAdditionalButtonsOffsetCompact = 0;
CGFloat constexpr kRoutingAdditionalButtonsOffsetRegular = 48;
@ -30,6 +33,8 @@ CGFloat constexpr kSpeedDistanceOffsetRegular = 16;
CGFloat constexpr kSpeedDistanceWidthCompact = 72;
CGFloat constexpr kSpeedDistanceWidthLandscape = 128;
CGFloat constexpr kSpeedDistanceWidthRegular = 88;
CGFloat constexpr kGoButtonWidthLandscape = 128;
CGFloat constexpr kGoButtonWidthRegular = 96;
CGFloat constexpr kPageControlTopOffsetRegular = 0;
CGFloat constexpr kPageControlTopOffsetLandscape = -8;
CGFloat constexpr kPageControlScaleLandscape = 0.7;
@ -76,12 +81,20 @@ CGFloat constexpr kTimeWidthRegular = 128;
@property(weak, nonatomic) IBOutlet UILabel * distanceLegendLabel;
@property(weak, nonatomic) IBOutlet UILabel * speedWithLegendLabel;
@property(weak, nonatomic) IBOutlet UILabel * distanceWithLegendLabel;
@property(weak, nonatomic) IBOutlet UILabel * estimateLabel;
@property(weak, nonatomic) IBOutlet UIView * heightProfileContainer;
@property(weak, nonatomic) IBOutlet UIImageView * heightProfileImage;
@property(weak, nonatomic) IBOutlet UIPageControl * pageControl;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * pageControlTopOffset;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * speedDistanceWidth;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * timeWidth;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * goButtonWidth;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * estimateLabelTopOffset;
@property(nonatomic) IBOutletCollection(NSLayoutConstraint)
NSArray * heightProfileContainerVerticalOrientation;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * routingViewManuButtonPffset;
@property(nonatomic) CGFloat layoutDuration;
@ -97,6 +110,8 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.additionalButtons.hidden = YES;
self.downloadBadge.hidden = YES;
self.goButton.hidden = YES;
self.estimateLabel.hidden = YES;
self.heightProfileContainer.hidden = YES;
self.toggleInfoButton.hidden = YES;
self.speedView.hidden = YES;
self.timeView.hidden = YES;
@ -137,6 +152,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
}];
((EAGLView *)self.superview).widgetsManager.bottomBound = self.mainButtonsHeight.constant;
[self updateFonts];
[self updateHeightProfile];
[super layoutSubviews];
}
@ -147,6 +163,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
case MWMBottomMenuStateHidden: break;
case MWMBottomMenuStateInactive:
self.backgroundColor = [UIColor menuBackground];
self.menuButton.alpha = 1.0;
self.bookmarksButton.alpha = 1.0;
self.downloadBadge.alpha = 1.0;
self.routingView.alpha = 0.0;
@ -156,6 +173,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
break;
case MWMBottomMenuStateActive:
self.backgroundColor = [UIColor white];
self.menuButton.alpha = 1.0;
self.bookmarksButton.alpha = 1.0;
self.downloadBadge.alpha = 0.0;
self.routingView.alpha = 0.0;
@ -171,6 +189,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.p2pButton.alpha = 0.0;
self.searchButton.alpha = 0.0;
}
self.menuButton.alpha = 1.0;
self.downloadBadge.alpha = 0.0;
self.routingView.alpha = 0.0;
self.routingAdditionalView.alpha = 0.0;
@ -178,10 +197,13 @@ CGFloat constexpr kTimeWidthRegular = 128;
case MWMBottomMenuStatePlanning:
case MWMBottomMenuStateGo:
self.backgroundColor = [UIColor white];
self.menuButton.alpha = 0.0;
self.downloadBadge.alpha = 1.0;
self.bookmarksButton.alpha = 0.0;
self.routingView.alpha = 1.0;
self.goButton.alpha = 1.0;
self.estimateLabel.alpha = 1.0;
self.heightProfileContainer.alpha = 1.0;
self.speedView.alpha = 0.0;
self.timeView.alpha = 0.0;
self.distanceView.alpha = 0.0;
@ -193,10 +215,13 @@ CGFloat constexpr kTimeWidthRegular = 128;
case MWMBottomMenuStateRouting:
case MWMBottomMenuStateRoutingExpanded:
self.backgroundColor = [UIColor white];
self.menuButton.alpha = 1.0;
self.downloadBadge.alpha = 0.0;
self.bookmarksButton.alpha = 0.0;
self.routingView.alpha = 1.0;
self.goButton.alpha = 0.0;
self.estimateLabel.alpha = 0.0;
self.heightProfileContainer.alpha = 0.0;
self.speedView.alpha = 1.0;
self.timeView.alpha = 1.0;
self.distanceView.alpha = 1.0;
@ -222,6 +247,18 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.distanceLegendLabel.font = legendFont;
}
- (void)updateHeightProfile
{
if (self.heightProfileContainer.hidden || ![MWMRouter hasRouteAltitude])
return;
dispatch_async(dispatch_get_main_queue(), ^{
[[MWMRouter router] routeAltitudeImageForSize:self.heightProfileImage.frame.size
completion:^(UIImage * image) {
self.heightProfileImage.image = image;
}];
});
}
- (void)updateVisibility
{
switch (self.state)
@ -250,6 +287,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
break;
case MWMBottomMenuStatePlanning:
case MWMBottomMenuStateGo:
self.menuButton.hidden = YES;
self.bookmarksButton.hidden = YES;
self.p2pButton.hidden = YES;
self.searchButton.hidden = YES;
@ -272,13 +310,36 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.additionalButtonsHeight.constant = 0.0;
self.menuButtonWidth.constant = kDefaultMenuButtonWidth;
self.mainButtonsHeight.constant = kDefaultMainButtonsHeight;
self.routingViewManuButtonPffset.priority = UILayoutPriorityDefaultHigh;
self.routingAdditionalViewHeight.constant = 0.0;
switch (self.state)
{
case MWMBottomMenuStateHidden: self.minY = self.superview.height; return;
case MWMBottomMenuStateInactive:
case MWMBottomMenuStateInactive: break;
case MWMBottomMenuStatePlanning:
case MWMBottomMenuStateGo: break;
[self layoutPlanningGeometry];
self.mainButtonsHeight.constant = 0.0;
break;
case MWMBottomMenuStateGo:
{
[self layoutPlanningGeometry];
if ([MWMRouter hasRouteAltitude])
{
BOOL const isLandscape = self.width > self.layoutThreshold;
if (isLandscape)
{
self.mainButtonsHeight.constant = kBicyclePlanningMainButtonsHeightLandscape;
}
else
{
self.estimateLabelTopOffset.priority = UILayoutPriorityDefaultHigh;
for (NSLayoutConstraint * constraint in self.heightProfileContainerVerticalOrientation)
constraint.priority = UILayoutPriorityDefaultHigh;
self.mainButtonsHeight.constant = kBicyclePlanningMainButtonsHeightRegular;
}
}
break;
}
case MWMBottomMenuStateCompact:
if (self.restoreState == MWMBottomMenuStateRouting && !IPAD &&
UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
@ -314,6 +375,16 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.frame = {{self.superview.width - width, self.superview.height - height}, {width, height}};
}
- (void)layoutPlanningGeometry
{
BOOL const isLandscape = self.width > self.layoutThreshold;
self.estimateLabelTopOffset.priority = UILayoutPriorityDefaultLow;
self.routingViewManuButtonPffset.priority = UILayoutPriorityDefaultLow;
for (NSLayoutConstraint * constraint in self.heightProfileContainerVerticalOrientation)
constraint.priority = UILayoutPriorityDefaultLow;
self.goButtonWidth.constant = isLandscape ? kGoButtonWidthLandscape : kGoButtonWidthRegular;
}
- (void)layoutRoutingGeometry
{
auto layoutAdditionalButtonsOffset = ^(CGFloat offset) {
@ -513,6 +584,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
_leftBound = 0.0;
[self updateBadge];
self.p2pButton.hidden = self.searchButton.hidden = self.bookmarksButton.hidden = NO;
self.menuButton.hidden = NO;
self.layoutDuration =
(_state == MWMBottomMenuStateCompact && !IPAD) ? 0.0 : kDefaultAnimationDuration;
break;
@ -520,6 +592,7 @@ CGFloat constexpr kTimeWidthRegular = 128;
case MWMBottomMenuStateActive:
self.restoreState = _state;
[self updateMenuButtonFromState:_state toState:state];
self.menuButton.hidden = NO;
self.additionalButtons.hidden = NO;
self.bookmarksButton.hidden = NO;
self.p2pButton.hidden = NO;
@ -529,10 +602,13 @@ CGFloat constexpr kTimeWidthRegular = 128;
if (_state == MWMBottomMenuStateGo)
self.restoreState = _state;
self.layoutDuration = IPAD ? kDefaultAnimationDuration : 0.0;
self.menuButton.hidden = NO;
break;
case MWMBottomMenuStatePlanning:
self.goButton.enabled = NO;
self.goButton.hidden = NO;
self.estimateLabel.hidden = YES;
self.heightProfileContainer.hidden = YES;
self.toggleInfoButton.hidden = YES;
self.speedView.hidden = YES;
self.timeView.hidden = YES;
@ -544,6 +620,8 @@ CGFloat constexpr kTimeWidthRegular = 128;
case MWMBottomMenuStateGo:
self.goButton.enabled = YES;
self.goButton.hidden = NO;
self.estimateLabel.hidden = NO;
self.heightProfileContainer.hidden = ![MWMRouter hasRouteAltitude];
self.toggleInfoButton.hidden = YES;
self.speedView.hidden = YES;
self.timeView.hidden = YES;
@ -553,7 +631,10 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.routingAdditionalView.hidden = YES;
break;
case MWMBottomMenuStateRouting:
self.menuButton.hidden = NO;
self.goButton.hidden = YES;
self.estimateLabel.hidden = YES;
self.heightProfileContainer.hidden = YES;
self.toggleInfoButton.hidden = NO;
self.speedView.hidden = NO;
self.timeView.hidden = NO;
@ -563,7 +644,10 @@ CGFloat constexpr kTimeWidthRegular = 128;
self.routingAdditionalView.hidden = YES;
break;
case MWMBottomMenuStateRoutingExpanded:
self.menuButton.hidden = NO;
self.goButton.hidden = YES;
self.estimateLabel.hidden = YES;
self.heightProfileContainer.hidden = YES;
self.toggleInfoButton.hidden = NO;
self.speedView.hidden = NO;
self.timeView.hidden = NO;

View file

@ -20,6 +20,7 @@
@property(nonatomic) MWMBottomMenuState state;
@property(weak, nonatomic) IBOutlet MWMButton * p2pButton;
@property(nonatomic) CGFloat leftBound;
@property(nonatomic, readonly) CGFloat mainButtonsHeight;
- (instancetype)initWithParentController:(MapViewController *)controller
delegate:(id<MWMBottomMenuControllerProtocol>)delegate;

View file

@ -80,6 +80,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) {
@property(weak, nonatomic) IBOutlet UILabel * speedWithLegendLabel;
@property(weak, nonatomic) IBOutlet UILabel * distanceWithLegendLabel;
@property(weak, nonatomic) IBOutlet UIPageControl * routingInfoPageControl;
@property(weak, nonatomic) IBOutlet UILabel * estimateLabel;
@property(weak, nonatomic) IBOutlet UIView * progressView;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * routingProgress;
@ -149,6 +150,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) {
NSFontAttributeName : [UIFont bold14]
};
self.estimateLabel.attributedText = info.estimate;
self.navigationInfo = info;
if (self.routingInfoPageControl.currentPage == 0)
{

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
@ -13,6 +13,7 @@
<outlet property="distanceLabel" destination="LBZ-kD-25J" id="mBJ-kK-1Af"/>
<outlet property="distanceLegendLabel" destination="5ad-tg-al9" id="KFC-sq-rNA"/>
<outlet property="distanceWithLegendLabel" destination="LOZ-cm-r9V" id="H0T-Dh-0Q0"/>
<outlet property="estimateLabel" destination="EQy-vz-gyi" id="gJq-I7-TaC"/>
<outlet property="p2pButton" destination="xQ0-ZK-UXk" id="LdY-Rt-Dh4"/>
<outlet property="progressView" destination="qvF-jY-5Gi" id="vS9-Cr-K1S"/>
<outlet property="routingInfoPageControl" destination="7hO-Gk-BGJ" id="gDI-Bk-PCb"/>
@ -79,14 +80,34 @@
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="c75-ZF-hKn">
<rect key="frame" x="0.0" y="0.0" width="260" height="48"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="33 мин • 7.0 км" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EQy-vz-gyi">
<rect key="frame" x="16" y="14" width="122" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4Xc-Kl-hAm">
<rect key="frame" x="154" y="12" width="54" height="24"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="150" verticalHuggingPriority="150" horizontalCompressionResistancePriority="240" verticalCompressionResistancePriority="240" translatesAutoresizingMaskIntoConstraints="NO" id="ViI-p6-hUf">
<rect key="frame" x="0.0" y="0.0" width="54" height="24"/>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="ViI-p6-hUf" firstAttribute="leading" secondItem="4Xc-Kl-hAm" secondAttribute="leading" id="4Rl-3k-ej1"/>
<constraint firstAttribute="bottom" secondItem="ViI-p6-hUf" secondAttribute="bottom" id="YtA-RO-fmc"/>
<constraint firstItem="ViI-p6-hUf" firstAttribute="top" secondItem="4Xc-Kl-hAm" secondAttribute="top" id="gHG-Ij-huG"/>
<constraint firstAttribute="trailing" secondItem="ViI-p6-hUf" secondAttribute="trailing" id="tnv-Fq-At9"/>
</constraints>
</view>
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pLD-sZ-ejH" userLabel="Go" customClass="MWMStartButton">
<rect key="frame" x="100" y="8" width="120" height="32"/>
<rect key="frame" x="224" y="0.0" width="96" height="48"/>
<accessibility key="accessibilityConfiguration" identifier="goButton"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" priority="750" constant="120" id="mDy-2S-lW3"/>
<constraint firstAttribute="height" priority="750" constant="32" id="pPq-7v-L5J"/>
<constraint firstAttribute="width" constant="96" id="ZHw-Ha-INX"/>
</constraints>
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
<state key="normal" title="Start"/>
@ -95,9 +116,6 @@
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="p2p_start"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
@ -148,7 +166,7 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Z68-6z-5Ph">
<rect key="frame" x="74" y="0.0" width="112" height="48"/>
<rect key="frame" x="104" y="0.0" width="112" height="48"/>
<subviews>
<pageControl opaque="NO" contentMode="scaleToFill" verticalCompressionResistancePriority="100" contentHorizontalAlignment="center" contentVerticalAlignment="center" numberOfPages="2" translatesAutoresizingMaskIntoConstraints="NO" id="7hO-Gk-BGJ">
<rect key="frame" x="44" y="4" width="23" height="13"/>
@ -176,7 +194,7 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mab-rl-ueg">
<rect key="frame" x="188" y="0.0" width="72" height="48"/>
<rect key="frame" x="248" y="0.0" width="72" height="48"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LOZ-cm-r9V">
<rect key="frame" x="36" y="4" width="0.0" height="0.0"/>
@ -237,7 +255,7 @@
</constraints>
</view>
<button contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3oJ-Rv-JS7" userLabel="ToggleInfo">
<rect key="frame" x="0.0" y="0.0" width="260" height="48"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<connections>
<action selector="toggleInfoTouchUpInside" destination="-1" eventType="touchUpInside" id="kuP-Ue-Syq"/>
@ -252,16 +270,28 @@
<constraint firstItem="5ad-tg-al9" firstAttribute="centerY" secondItem="7hO-Gk-BGJ" secondAttribute="centerY" priority="500" id="6Q9-vO-V4W"/>
<constraint firstItem="Z68-6z-5Ph" firstAttribute="centerX" secondItem="c75-ZF-hKn" secondAttribute="centerX" id="AcE-Sk-hhd"/>
<constraint firstAttribute="bottom" secondItem="Z68-6z-5Ph" secondAttribute="bottom" id="BlR-TS-xJa"/>
<constraint firstAttribute="trailing" secondItem="pLD-sZ-ejH" secondAttribute="trailing" id="E7k-Dh-qE5"/>
<constraint firstAttribute="bottom" secondItem="4Xc-Kl-hAm" secondAttribute="bottom" constant="12" id="IBg-Su-7fT"/>
<constraint firstAttribute="bottom" secondItem="3oJ-Rv-JS7" secondAttribute="bottom" id="QSK-8y-lMm"/>
<constraint firstAttribute="bottom" secondItem="mab-rl-ueg" secondAttribute="bottom" id="RM8-hF-4fE"/>
<constraint firstItem="mab-rl-ueg" firstAttribute="width" secondItem="UhW-en-7qq" secondAttribute="width" id="RsJ-Zl-Sbw"/>
<constraint firstItem="4Xc-Kl-hAm" firstAttribute="leading" secondItem="EQy-vz-gyi" secondAttribute="trailing" priority="500" constant="16" id="S6n-p8-BQM"/>
<constraint firstAttribute="bottom" secondItem="pLD-sZ-ejH" secondAttribute="bottom" id="SWA-4d-AZp"/>
<constraint firstItem="UhW-en-7qq" firstAttribute="top" secondItem="c75-ZF-hKn" secondAttribute="top" id="SX8-Al-kd6"/>
<constraint firstItem="pLD-sZ-ejH" firstAttribute="top" secondItem="c75-ZF-hKn" secondAttribute="top" id="XO3-hI-QYl"/>
<constraint firstItem="3oJ-Rv-JS7" firstAttribute="leading" secondItem="c75-ZF-hKn" secondAttribute="leading" id="Y2N-5d-l3x"/>
<constraint firstItem="UhW-en-7qq" firstAttribute="leading" secondItem="c75-ZF-hKn" secondAttribute="leading" id="ZCC-xJ-5Vg"/>
<constraint firstItem="4Xc-Kl-hAm" firstAttribute="top" secondItem="EQy-vz-gyi" secondAttribute="bottom" priority="250" constant="8" id="ZCb-We-WNy"/>
<constraint firstItem="EQy-vz-gyi" firstAttribute="centerY" secondItem="c75-ZF-hKn" secondAttribute="centerY" priority="500" id="ZKG-5z-sra"/>
<constraint firstItem="Z68-6z-5Ph" firstAttribute="top" secondItem="c75-ZF-hKn" secondAttribute="top" id="cpY-Wy-lyr"/>
<constraint firstItem="EQy-vz-gyi" firstAttribute="leading" secondItem="c75-ZF-hKn" secondAttribute="leading" constant="16" id="fIE-wa-hE8"/>
<constraint firstItem="EQy-vz-gyi" firstAttribute="top" secondItem="c75-ZF-hKn" secondAttribute="top" priority="250" constant="14" id="fOa-qL-A5d"/>
<constraint firstItem="pLD-sZ-ejH" firstAttribute="leading" secondItem="4Xc-Kl-hAm" secondAttribute="trailing" constant="16" id="h3c-E6-aX6"/>
<constraint firstItem="P9v-a6-EaA" firstAttribute="centerY" secondItem="7hO-Gk-BGJ" secondAttribute="centerY" priority="500" id="hEB-H2-4WJ"/>
<constraint firstItem="4Xc-Kl-hAm" firstAttribute="leading" secondItem="c75-ZF-hKn" secondAttribute="leading" priority="250" constant="12" id="mac-YL-Cyx"/>
<constraint firstItem="3oJ-Rv-JS7" firstAttribute="top" secondItem="c75-ZF-hKn" secondAttribute="top" id="plc-KQ-Bxg"/>
<constraint firstAttribute="bottom" secondItem="UhW-en-7qq" secondAttribute="bottom" id="tF2-H2-VBe"/>
<constraint firstItem="4Xc-Kl-hAm" firstAttribute="top" secondItem="c75-ZF-hKn" secondAttribute="top" priority="500" constant="12" id="vt3-dc-Ngf"/>
<constraint firstAttribute="trailing" secondItem="mab-rl-ueg" secondAttribute="trailing" id="w4c-fR-znA"/>
</constraints>
</view>
@ -298,20 +328,19 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="qvF-jY-5Gi" firstAttribute="leading" secondItem="kbJ-If-gUR" secondAttribute="leading" id="4FM-cc-hga"/>
<constraint firstItem="YLY-C4-SBu" firstAttribute="leading" secondItem="c75-ZF-hKn" secondAttribute="trailing" priority="250" id="4e2-YH-he6"/>
<constraint firstAttribute="trailing" secondItem="YLY-C4-SBu" secondAttribute="trailing" identifier="menuTrailing" id="Ade-MQ-41P"/>
<constraint firstItem="c75-ZF-hKn" firstAttribute="leading" secondItem="kbJ-If-gUR" secondAttribute="leading" id="B1y-C3-Q6g"/>
<constraint firstItem="WLn-2O-Ivv" firstAttribute="centerY" secondItem="YLY-C4-SBu" secondAttribute="centerY" constant="-8" id="CjF-ja-g56"/>
<constraint firstItem="YLY-C4-SBu" firstAttribute="leading" secondItem="c75-ZF-hKn" secondAttribute="trailing" id="H9a-7s-eqN"/>
<constraint firstItem="YLY-C4-SBu" firstAttribute="centerY" secondItem="kbJ-If-gUR" secondAttribute="centerY" id="Hly-tK-GHj"/>
<constraint firstAttribute="height" constant="48" id="HtR-j8-Qpc"/>
<constraint firstItem="IzQ-aQ-aPH" firstAttribute="height" secondItem="kbJ-If-gUR" secondAttribute="height" id="JFI-3b-72w"/>
<constraint firstItem="pLD-sZ-ejH" firstAttribute="centerY" secondItem="kbJ-If-gUR" secondAttribute="centerY" id="MRS-a0-NHj"/>
<constraint firstAttribute="trailing" secondItem="c75-ZF-hKn" secondAttribute="trailing" priority="500" id="L0y-Zo-LJu"/>
<constraint firstItem="c75-ZF-hKn" firstAttribute="top" secondItem="kbJ-If-gUR" secondAttribute="top" id="OyE-mG-Zi1"/>
<constraint firstItem="xQ0-ZK-UXk" firstAttribute="centerX" secondItem="kbJ-If-gUR" secondAttribute="centerX" multiplier="22:30" id="RMv-Kx-9s6"/>
<constraint firstItem="qVh-dm-DDH" firstAttribute="centerY" secondItem="kbJ-If-gUR" secondAttribute="centerY" id="Rgu-Ok-h30"/>
<constraint firstItem="xQ0-ZK-UXk" firstAttribute="height" secondItem="kbJ-If-gUR" secondAttribute="height" id="WRQ-HY-d1P"/>
<constraint firstItem="qVh-dm-DDH" firstAttribute="centerX" secondItem="kbJ-If-gUR" secondAttribute="centerX" multiplier="385:300" id="Wda-vl-hB4"/>
<constraint firstItem="pLD-sZ-ejH" firstAttribute="centerX" secondItem="kbJ-If-gUR" secondAttribute="centerX" id="c08-Te-hPQ"/>
<constraint firstItem="qVh-dm-DDH" firstAttribute="height" secondItem="kbJ-If-gUR" secondAttribute="height" id="d2K-hv-PmH"/>
<constraint firstAttribute="bottom" secondItem="c75-ZF-hKn" secondAttribute="bottom" id="f6U-e7-mij"/>
<constraint firstItem="WLn-2O-Ivv" firstAttribute="centerX" secondItem="YLY-C4-SBu" secondAttribute="centerX" constant="8" id="lUQ-gw-psA"/>
@ -441,7 +470,12 @@
<outlet property="distanceView" destination="mab-rl-ueg" id="wnH-29-JDU"/>
<outlet property="distanceWithLegendLabel" destination="LOZ-cm-r9V" id="Cdx-SJ-kAY"/>
<outlet property="downloadBadge" destination="WLn-2O-Ivv" id="f9u-k6-l9u"/>
<outlet property="estimateLabel" destination="EQy-vz-gyi" id="lVV-FW-8AJ"/>
<outlet property="estimateLabelTopOffset" destination="fOa-qL-A5d" id="7eJ-Go-MBm"/>
<outlet property="goButton" destination="pLD-sZ-ejH" id="Txw-4S-mwR"/>
<outlet property="goButtonWidth" destination="ZHw-Ha-INX" id="H3K-lh-Iyx"/>
<outlet property="heightProfileContainer" destination="4Xc-Kl-hAm" id="ovY-lT-vrD"/>
<outlet property="heightProfileImage" destination="ViI-p6-hUf" id="8b8-rT-Hpc"/>
<outlet property="mainButtons" destination="kbJ-If-gUR" id="1sk-bi-6xl"/>
<outlet property="mainButtonsHeight" destination="HtR-j8-Qpc" id="eF8-KH-F9n"/>
<outlet property="menuButton" destination="YLY-C4-SBu" id="A5G-Bc-IlQ"/>
@ -454,6 +488,7 @@
<outlet property="routingAdditionalView" destination="Z8y-bh-6dN" id="mI8-4T-Rbi"/>
<outlet property="routingAdditionalViewHeight" destination="7YS-h4-f40" id="24L-Xv-Z9V"/>
<outlet property="routingView" destination="c75-ZF-hKn" id="OdE-md-8FJ"/>
<outlet property="routingViewManuButtonPffset" destination="4e2-YH-he6" id="nie-j7-P27"/>
<outlet property="searchButton" destination="IzQ-aQ-aPH" id="2dy-QI-T39"/>
<outlet property="separator" destination="nYy-JN-hGA" id="z8u-tH-WGu"/>
<outlet property="separatorHeight" destination="Kgm-bO-O6Q" id="RGg-dL-lKg"/>
@ -470,6 +505,8 @@
<outletCollection property="routingAdditionalButtonsOffset" destination="1Zb-qW-cfl" id="gnD-xP-k5z"/>
<outletCollection property="speedDistanceOffset" destination="ZCC-xJ-5Vg" id="IfJ-Mb-OUw"/>
<outletCollection property="speedDistanceOffset" destination="w4c-fR-znA" id="q0p-e4-syx"/>
<outletCollection property="heightProfileContainerVerticalOrientation" destination="mac-YL-Cyx" id="L7C-H0-A6R"/>
<outletCollection property="heightProfileContainerVerticalOrientation" destination="ZCb-We-WNy" id="uzJ-Eb-Epe"/>
</connections>
</view>
</objects>

View file

@ -1,22 +1,22 @@
#import "MWMSideButtonsView.h"
#import "Common.h"
#import "MWMButton.h"
#import "MWMMapViewControlsCommon.h"
#import "MWMSideButtonsView.h"
namespace
{
CGFloat constexpr kZoomOutToLayoutPortraitOffset = 52;
} // namespace
} // namespace
@interface MWMSideButtonsView()
@interface MWMSideButtonsView ()
@property (nonatomic) CGRect defaultBounds;
@property(nonatomic) CGRect defaultBounds;
@property (weak, nonatomic) IBOutlet MWMButton * zoomIn;
@property (weak, nonatomic) IBOutlet MWMButton * zoomOut;
@property (weak, nonatomic) IBOutlet MWMButton * location;
@property(weak, nonatomic) IBOutlet MWMButton * zoomIn;
@property(weak, nonatomic) IBOutlet MWMButton * zoomOut;
@property(weak, nonatomic) IBOutlet MWMButton * location;
@property (nonatomic) BOOL isPortrait;
@property(nonatomic) BOOL isPortrait;
@end
@ -57,27 +57,23 @@ CGFloat constexpr kZoomOutToLayoutPortraitOffset = 52;
self.maxX = self.superview.width - kViewControlsOffsetToBounds;
}
- (void)layoutYPosition
{
self.maxY = self.bottomBound;
}
- (void)layoutYPosition { self.maxY = self.bottomBound; }
- (void)fadeZoomButtonsShow:(BOOL)show
{
CGFloat const alpha = show ? 1.0 : 0.0;
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^
{
self.zoomIn.alpha = alpha;
self.zoomOut.alpha = alpha;
}];
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount)
animations:^{
self.zoomIn.alpha = alpha;
self.zoomOut.alpha = alpha;
}];
}
- (void)fadeLocationButtonShow:(BOOL)show
{
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^
{
self.location.alpha = show ? 1.0 : 0.0;
}];
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount)
animations:^{
self.location.alpha = show ? 1.0 : 0.0;
}];
}
- (void)animate
@ -131,15 +127,14 @@ CGFloat constexpr kZoomOutToLayoutPortraitOffset = 52;
if (!hidden)
self.hidden = NO;
[self layoutXPosition:!hidden];
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^
{
[self layoutXPosition:hidden];
}
completion:^(BOOL finished)
{
if (hidden)
self.hidden = YES;
}];
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount)
animations:^{
[self layoutXPosition:hidden];
}
completion:^(BOOL finished) {
if (hidden)
self.hidden = YES;
}];
}
else
{
@ -157,11 +152,7 @@ CGFloat constexpr kZoomOutToLayoutPortraitOffset = 52;
[self animate];
}
- (CGFloat)topBound
{
return MAX(0.0, _topBound);
}
- (CGFloat)topBound { return MAX(0.0, _topBound); }
@synthesize bottomBound = _bottomBound;
- (void)setBottomBound:(CGFloat)bottomBound
@ -176,8 +167,7 @@ CGFloat constexpr kZoomOutToLayoutPortraitOffset = 52;
{
if (!self.superview)
return _bottomBound;
CGFloat const bottomBoundLimit =
(self.superview.height - self.zoomOut.maxY) / 2 - (self.location.maxY - self.zoomOut.maxY);
CGFloat const bottomBoundLimit = (self.superview.height - self.location.maxY) / 2;
return MIN(self.superview.height - bottomBoundLimit, _bottomBound);
}

View file

@ -20,6 +20,7 @@
@property(nonatomic, readonly) CGFloat progress;
//@property (nonatomic, readonly) vector<location::FollowingInfo::SingleLaneInfoClient> lanes;
@property(nonatomic, readonly) BOOL isPedestrian;
@property(nonatomic, readonly) NSAttributedString * estimate;
- (void)updateFollowingInfo:(location::FollowingInfo const &)info;

View file

@ -3,6 +3,9 @@
#import "MWMLocationManager.h"
#import "MWMSettings.h"
#import "MapsAppDelegate.h"
#import "TimeUtils.h"
#import "UIColor+MapsMeColor.h"
#import "UIFont+MapsMeFonts.h"
#include "Framework.h"
#include "geometry/distance_on_sphere.hpp"
@ -51,6 +54,18 @@ using namespace routing::turns;
_nextTurnImage = image(info.m_nextTurn, true);
}
NSDictionary * etaAttributes = @{
NSForegroundColorAttributeName : UIColor.blackPrimaryText,
NSFontAttributeName : UIFont.medium17
};
NSString * eta = [NSDateFormatter estimatedArrivalTimeWithSeconds:_timeToTarget];
NSString * resultString =
[NSString stringWithFormat:@"%@ • %@ %@", eta, _targetDistance, _targetUnits];
NSMutableAttributedString * result =
[[NSMutableAttributedString alloc] initWithString:resultString];
[result addAttributes:etaAttributes range:NSMakeRange(0, eta.length)];
_estimate = [result copy];
TurnDirection const turn = info.m_turn;
_turnImage = image(turn, false);
BOOL const isRound = turn == TurnDirection::EnterRoundAbout ||

View file

@ -1,11 +1,11 @@
#import "Common.h"
#import "MWMNavigationView.h"
#import "Common.h"
@interface MWMNavigationView ()
@property (nonatomic) BOOL isVisible;
@property(nonatomic) BOOL isVisible;
@property (weak, nonatomic, readwrite) IBOutlet UIView * contentView;
@property(weak, nonatomic, readwrite) IBOutlet UIView * contentView;
@end
@ -28,32 +28,24 @@
NSAssert(superview != nil, @"Superview can't be nil");
if ([superview.subviews containsObject:self])
return;
if (IPAD)
[superview addSubview:self];
else
[superview insertSubview:self atIndex:0];
}
- (void)remove
{
self.isVisible = NO;
[superview addSubview:self];
}
- (void)remove { self.isVisible = NO; }
- (void)layoutSubviews
{
[UIView animateWithDuration:kDefaultAnimationDuration animations:^
{
if (!CGRectEqualToRect(self.frame, self.defaultFrame))
self.frame = self.defaultFrame;
CGFloat const sbHeight = statusBarHeight();
self.statusbarBackground.frame = CGRectMake(0.0, -sbHeight, self.width, sbHeight);
[self.delegate navigationDashBoardDidUpdate];
}
completion:^(BOOL finished)
{
if (!self.isVisible)
[self removeFromSuperview];
}];
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
if (!CGRectEqualToRect(self.frame, self.defaultFrame))
self.frame = self.defaultFrame;
CGFloat const sbHeight = statusBarHeight();
self.statusbarBackground.frame = CGRectMake(0.0, -sbHeight, self.width, sbHeight);
[self.delegate navigationDashBoardDidUpdate];
}
completion:^(BOOL finished) {
if (!self.isVisible)
[self removeFromSuperview];
}];
[super layoutSubviews];
}

View file

@ -6,10 +6,7 @@
#import "MWMRoutePointLayout.h"
#import "MWMRouter.h"
#import "Statistics.h"
#import "TimeUtils.h"
#import "UIButton+Orientation.h"
#import "UIColor+MapsMeColor.h"
#import "UIFont+MapsMeFonts.h"
static CGFloat constexpr kAdditionalHeight = 20.;
@ -20,7 +17,6 @@ static CGFloat constexpr kAdditionalHeight = 20.;
@property(weak, nonatomic) IBOutlet UIView * vehicle;
@property(weak, nonatomic) IBOutlet UIView * bicycle;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * planningRouteViewHeight;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * planningContainerHeight;
@property(weak, nonatomic, readwrite) IBOutlet UIButton * extendButton;
@property(weak, nonatomic) IBOutlet UIButton * goButton;
@property(weak, nonatomic) IBOutlet UICollectionView * collectionView;
@ -29,11 +25,15 @@ static CGFloat constexpr kAdditionalHeight = 20.;
@property(weak, nonatomic) IBOutlet UIView * statusBox;
@property(weak, nonatomic) IBOutlet UIView * planningBox;
@property(weak, nonatomic) IBOutlet UIView * resultsBox;
@property(weak, nonatomic) IBOutlet UIView * heightBox;
@property(weak, nonatomic) IBOutlet UIView * errorBox;
@property(weak, nonatomic) IBOutlet UILabel * resultLabel;
@property(weak, nonatomic) IBOutlet UILabel * arriveLabel;
@property(weak, nonatomic) IBOutlet UIImageView * completeImageView;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * statusBoxHeight;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * resultsBoxHeight;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * heightBoxHeight;
@property(weak, nonatomic) IBOutlet UIImageView * heightProfileImage;
@property(nonatomic) UIImageView * movingCellImage;
@property(nonatomic) BOOL isNeedToMove;
@ -75,21 +75,28 @@ static CGFloat constexpr kAdditionalHeight = 20.;
routerType:(routing::RouterType)routerType
{
MWMCircularProgress * progress = [[MWMCircularProgress alloc] initWithParentView:parentView];
[progress setImage:[UIImage imageNamed:imageName]
forStates:{MWMCircularProgressStateNormal, MWMCircularProgressStateFailed,
MWMCircularProgressStateSelected, MWMCircularProgressStateProgress,
MWMCircularProgressStateSpinner, MWMCircularProgressStateCompleted}];
MWMCircularProgressStateVec const imageStates = {
MWMCircularProgressStateNormal, MWMCircularProgressStateFailed,
MWMCircularProgressStateSelected, MWMCircularProgressStateProgress,
MWMCircularProgressStateSpinner, MWMCircularProgressStateCompleted};
[progress setImage:[UIImage imageNamed:imageName] forStates:imageStates];
[progress setColoring:MWMButtonColoringGray forStates:{MWMCircularProgressStateNormal}];
[progress setColoring:MWMButtonColoringWhiteText
forStates:{MWMCircularProgressStateFailed, MWMCircularProgressStateSelected,
MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner,
MWMCircularProgressStateCompleted}];
[progress setSpinnerBackgroundColor:[UIColor clearColor]];
[progress setColor:[UIColor whiteColor]
forStates:{MWMCircularProgressStateProgress, MWMCircularProgressStateSpinner}];
progress.delegate = self;
m_progresses[routerType] = progress;
}
- (void)didMoveToSuperview { [self setupActualHeight]; }
- (void)addToView:(UIView *)superview
{
[super addToView:superview];
[superview bringSubviewToFront:superview];
}
- (void)statePrepare
{
for (auto const & progress : m_progresses)
@ -103,6 +110,7 @@ static CGFloat constexpr kAdditionalHeight = 20.;
[self.layout invalidateLayout];
self.statusBox.hidden = YES;
self.resultsBox.hidden = YES;
self.heightBox.hidden = YES;
self.planningBox.hidden = YES;
self.errorBox.hidden = YES;
}
@ -114,6 +122,7 @@ static CGFloat constexpr kAdditionalHeight = 20.;
self.goButton.enabled = NO;
self.statusBox.hidden = NO;
self.resultsBox.hidden = YES;
self.heightBox.hidden = YES;
self.errorBox.hidden = YES;
self.planningBox.hidden = NO;
[self reloadData];
@ -128,6 +137,7 @@ static CGFloat constexpr kAdditionalHeight = 20.;
self.statusBox.hidden = NO;
self.planningBox.hidden = YES;
self.resultsBox.hidden = YES;
self.heightBox.hidden = YES;
self.errorBox.hidden = NO;
if (IPAD)
[self iPadNotReady];
@ -141,6 +151,7 @@ static CGFloat constexpr kAdditionalHeight = 20.;
self.planningBox.hidden = YES;
self.errorBox.hidden = YES;
self.resultsBox.hidden = NO;
self.heightBox.hidden = ![MWMRouter hasRouteAltitude];
if (IPAD)
[self iPadReady];
}
@ -148,7 +159,9 @@ static CGFloat constexpr kAdditionalHeight = 20.;
- (void)iPadReady
{
[self layoutIfNeeded];
self.statusBoxHeight.constant = 76.;
self.statusBoxHeight.constant =
self.resultsBoxHeight.constant +
([MWMRouter hasRouteAltitude] ? self.heightBoxHeight.constant : 0);
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
[self layoutIfNeeded];
@ -159,17 +172,28 @@ static CGFloat constexpr kAdditionalHeight = 20.;
self.arriveLabel.alpha = 1.;
}
completion:^(BOOL finished) {
self.completeImageView.hidden = NO;
[self updateHeightProfile];
}];
}];
}
- (void)updateHeightProfile
{
if (![MWMRouter hasRouteAltitude])
return;
dispatch_async(dispatch_get_main_queue(), ^{
[[MWMRouter router] routeAltitudeImageForSize:self.heightProfileImage.frame.size
completion:^(UIImage * image) {
self.heightProfileImage.image = image;
}];
});
}
- (void)iPadNotReady
{
self.completeImageView.hidden = YES;
self.arriveLabel.alpha = 0.;
[self layoutIfNeeded];
self.statusBoxHeight.constant = 56.;
self.statusBoxHeight.constant = self.resultsBoxHeight.constant;
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
[self layoutIfNeeded];
@ -188,8 +212,7 @@ static CGFloat constexpr kAdditionalHeight = 20.;
{
[super layoutSubviews];
[self setupActualHeight];
if (IPAD)
[self.delegate routePreviewDidChangeFrame:self.frame];
[self.delegate routePreviewDidChangeFrame:self.frame];
[super layoutSubviews];
}
@ -251,12 +274,7 @@ static CGFloat constexpr kAdditionalHeight = 20.;
return {{origin, self.topBound}, {width, self.superview.height - kAdditionalHeight}};
}
- (CGFloat)visibleHeight
{
return self.planningRouteViewHeight.constant + self.planningContainerHeight.constant +
kAdditionalHeight;
}
- (CGFloat)visibleHeight { return self.planningRouteViewHeight.constant + kAdditionalHeight; }
- (IBAction)extendTap
{
BOOL const isExtended = !self.extendButton.selected;
@ -287,13 +305,10 @@ static CGFloat constexpr kAdditionalHeight = 20.;
}
BOOL const isPortrait = self.superview.height > self.superview.width;
CGFloat const height = isPortrait ? 140. : 96.;
CGFloat const planningRouteViewHeight = self.extendButton.selected ? height : 44.;
self.planningRouteViewHeight.constant = planningRouteViewHeight;
CGFloat const selfHeight = planningRouteViewHeight + self.planningContainerHeight.constant;
CGFloat const selfHeight = self.extendButton.selected ? height : 44.;
self.planningRouteViewHeight.constant = selfHeight;
self.defaultHeight = selfHeight;
self.height = selfHeight;
[self.dashboardManager.delegate
routePreviewDidChangeFrame:{self.origin, {self.width, selfHeight + kAdditionalHeight}}];
}
- (void)snapshotCell:(MWMRoutePointCell *)cell
@ -315,25 +330,11 @@ static CGFloat constexpr kAdditionalHeight = 20.;
l.rasterizationScale = [[UIScreen mainScreen] scale];
}
- (NSDictionary *)etaAttributes
{
return @{
NSForegroundColorAttributeName : UIColor.blackPrimaryText,
NSFontAttributeName : UIFont.medium17
};
}
#pragma mark - MWMNavigationDashboardInfoProtocol
- (void)updateNavigationInfo:(MWMNavigationDashboardEntity *)info
{
NSString * eta = [NSDateFormatter estimatedArrivalTimeWithSeconds:info.timeToTarget];
NSString * resultString =
[NSString stringWithFormat:@"%@ • %@ %@", eta, info.targetDistance, info.targetUnits];
NSMutableAttributedString * result =
[[NSMutableAttributedString alloc] initWithString:resultString];
[result addAttributes:self.etaAttributes range:NSMakeRange(0, eta.length)];
self.resultLabel.attributedText = result;
self.resultLabel.attributedText = info.estimate;
if (!IPAD)
return;

View file

@ -1,14 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<customFonts key="customFonts">
<mutableArray key="HelveticaNeue.ttc">
<string>HelveticaNeue-Medium</string>
</mutableArray>
</customFonts>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MWMNavigationDashboardManager">
<connections>
@ -17,7 +12,7 @@
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="aNH-vh-DPz" customClass="MWMRoutePreview">
<rect key="frame" x="0.0" y="0.0" width="320" height="188"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="140"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WqK-Yb-PmP" customClass="SolidTouchView">
@ -34,47 +29,55 @@
<action selector="routingStopTouchUpInside" destination="-1" eventType="touchUpInside" id="Gvl-qB-zAN"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DMt-LJ-mzn" userLabel="Title Box">
<rect key="frame" x="92" y="12" width="136" height="22"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oQc-l8-sZH" userLabel="Buttons Box">
<rect key="frame" x="81" y="0.0" width="158" height="44"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Planning Route" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pge-2d-3UB">
<rect key="frame" x="0.0" y="0.0" width="120" height="22"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cZF-Ha-2tB">
<rect key="frame" x="6" y="3" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="10" id="Aqu-Er-6Tx"/>
<constraint firstAttribute="height" constant="22" id="ywO-T8-W4N"/>
<constraint firstAttribute="width" constant="38" id="m6k-uU-yOl"/>
<constraint firstAttribute="height" constant="38" id="mp7-b4-xot"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="p2p_route_planning"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="whitePrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
</userDefinedRuntimeAttributes>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_arrow_up_and_down" translatesAutoresizingMaskIntoConstraints="NO" id="y8P-JL-riK">
<rect key="frame" x="128" y="9" width="8" height="8"/>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FuO-c6-y9C" userLabel="Bicycle">
<rect key="frame" x="60" y="3" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="8" id="LtD-Tz-US7"/>
<constraint firstAttribute="height" constant="8" id="uez-1b-JG5"/>
<constraint firstAttribute="width" constant="38" id="9fe-fw-05J"/>
<constraint firstAttribute="height" constant="38" id="gbm-NL-zgv"/>
</constraints>
</imageView>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6D3-QF-6wm">
<rect key="frame" x="114" y="3" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="38" id="815-LJ-2tk"/>
<constraint firstAttribute="height" constant="38" id="hXi-E7-GUb"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="y8P-JL-riK" firstAttribute="leading" secondItem="Pge-2d-3UB" secondAttribute="trailing" constant="8" id="2ns-ZL-f1m"/>
<constraint firstItem="Pge-2d-3UB" firstAttribute="top" secondItem="DMt-LJ-mzn" secondAttribute="top" id="Kkx-M5-3w7"/>
<constraint firstItem="y8P-JL-riK" firstAttribute="top" secondItem="DMt-LJ-mzn" secondAttribute="top" constant="9" id="LJ4-hh-HBz"/>
<constraint firstAttribute="height" constant="22" id="NBM-Ui-Cp5"/>
<constraint firstItem="Pge-2d-3UB" firstAttribute="leading" secondItem="DMt-LJ-mzn" secondAttribute="leading" id="RxG-1s-Hyp"/>
<constraint firstAttribute="trailing" secondItem="y8P-JL-riK" secondAttribute="trailing" id="q4E-gi-eja"/>
<constraint firstItem="FuO-c6-y9C" firstAttribute="centerY" secondItem="oQc-l8-sZH" secondAttribute="centerY" id="1De-4s-V8t"/>
<constraint firstItem="6D3-QF-6wm" firstAttribute="leading" secondItem="FuO-c6-y9C" secondAttribute="trailing" constant="16" id="91z-iC-oKp"/>
<constraint firstItem="cZF-Ha-2tB" firstAttribute="centerY" secondItem="oQc-l8-sZH" secondAttribute="centerY" id="MQh-op-cpN"/>
<constraint firstItem="cZF-Ha-2tB" firstAttribute="leading" secondItem="oQc-l8-sZH" secondAttribute="leading" constant="6" id="MjU-UA-Kax"/>
<constraint firstAttribute="height" constant="44" id="Mws-KZ-ghs"/>
<constraint firstItem="FuO-c6-y9C" firstAttribute="leading" secondItem="cZF-Ha-2tB" secondAttribute="trailing" constant="16" id="Z6M-UV-6x2"/>
<constraint firstAttribute="trailing" secondItem="6D3-QF-6wm" secondAttribute="trailing" constant="6" id="bZ7-zn-TAn"/>
<constraint firstItem="6D3-QF-6wm" firstAttribute="centerY" secondItem="oQc-l8-sZH" secondAttribute="centerY" id="vXO-6g-q4L"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0YR-3a-ucN">
<rect key="frame" x="92" y="12" width="136" height="28"/>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_arrow_up_and_down" translatesAutoresizingMaskIntoConstraints="NO" id="y8P-JL-riK">
<rect key="frame" x="292" y="18" width="13" height="8"/>
<constraints>
<constraint firstAttribute="height" constant="28" id="2lP-gs-1Bd"/>
<constraint firstAttribute="width" constant="13" id="LtD-Tz-US7"/>
<constraint firstAttribute="height" constant="8" id="uez-1b-JG5"/>
</constraints>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0YR-3a-ucN">
<rect key="frame" x="276" y="0.0" width="44" height="44"/>
<connections>
<action selector="extendTap" destination="aNH-vh-DPz" eventType="touchUpInside" id="oYh-e3-3Ln"/>
</connections>
@ -99,175 +102,28 @@
<color key="backgroundColor" red="0.12156862745098039" green="0.59999999999999998" blue="0.32156862745098036" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="140" id="2SX-TZ-tS3"/>
<constraint firstItem="DrK-vI-WkO" firstAttribute="top" secondItem="DMt-LJ-mzn" secondAttribute="bottom" constant="14" id="Ln4-6f-0un"/>
<constraint firstItem="0YR-3a-ucN" firstAttribute="centerX" secondItem="WqK-Yb-PmP" secondAttribute="centerX" id="MiR-4r-70K"/>
<constraint firstItem="0YR-3a-ucN" firstAttribute="top" secondItem="WqK-Yb-PmP" secondAttribute="top" id="DyS-8t-eoF"/>
<constraint firstItem="0YR-3a-ucN" firstAttribute="width" secondItem="wpf-tw-Coz" secondAttribute="width" id="IM7-F1-Enm"/>
<constraint firstItem="oQc-l8-sZH" firstAttribute="centerY" secondItem="wpf-tw-Coz" secondAttribute="centerY" id="NwC-Dq-AAM"/>
<constraint firstItem="0YR-3a-ucN" firstAttribute="height" secondItem="wpf-tw-Coz" secondAttribute="height" id="Of6-Cq-FHu"/>
<constraint firstItem="wpf-tw-Coz" firstAttribute="leading" secondItem="WqK-Yb-PmP" secondAttribute="leading" id="bK5-4Q-Rv9"/>
<constraint firstItem="wpf-tw-Coz" firstAttribute="top" secondItem="WqK-Yb-PmP" secondAttribute="top" id="cPc-fO-vAa"/>
<constraint firstItem="0YR-3a-ucN" firstAttribute="width" secondItem="DMt-LJ-mzn" secondAttribute="width" id="evf-UV-KzK"/>
<constraint firstItem="y8P-JL-riK" firstAttribute="centerY" secondItem="0YR-3a-ucN" secondAttribute="centerY" id="dYT-xy-0Dq"/>
<constraint firstAttribute="trailing" secondItem="DrK-vI-WkO" secondAttribute="trailing" priority="999" constant="8" id="jom-uc-MN0"/>
<constraint firstItem="DrK-vI-WkO" firstAttribute="leading" secondItem="WqK-Yb-PmP" secondAttribute="leading" priority="999" constant="8" id="kYp-Bb-6dW"/>
<constraint firstItem="DMt-LJ-mzn" firstAttribute="top" secondItem="WqK-Yb-PmP" secondAttribute="top" constant="12" id="qWW-1y-zZG"/>
<constraint firstItem="0YR-3a-ucN" firstAttribute="top" secondItem="WqK-Yb-PmP" secondAttribute="top" constant="12" id="zKm-WW-91Y"/>
<constraint firstItem="DrK-vI-WkO" firstAttribute="top" secondItem="wpf-tw-Coz" secondAttribute="bottom" constant="4" id="kb4-z8-KAi"/>
<constraint firstItem="oQc-l8-sZH" firstAttribute="centerX" secondItem="WqK-Yb-PmP" secondAttribute="centerX" id="ltA-tm-z3P"/>
<constraint firstItem="y8P-JL-riK" firstAttribute="centerX" secondItem="0YR-3a-ucN" secondAttribute="centerX" id="ohd-Ye-gQA"/>
<constraint firstAttribute="trailing" secondItem="0YR-3a-ucN" secondAttribute="trailing" id="qTd-74-BP9"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="primary"/>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sr7-UO-G0z" userLabel="PlanningContainer" customClass="SolidTouchView">
<rect key="frame" x="0.0" y="140" width="320" height="48"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OOA-K7-ybj" userLabel="Planning box">
<rect key="frame" x="142" y="14" width="166" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Planning..." textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="14" translatesAutoresizingMaskIntoConstraints="NO" id="Yzu-Z9-ZiH">
<rect key="frame" x="0.0" y="0.0" width="166" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.26000000000000001" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="p2p_planning"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackHintText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="Yzu-Z9-ZiH" firstAttribute="leading" secondItem="OOA-K7-ybj" secondAttribute="leading" id="I6U-Dn-Qk6"/>
<constraint firstAttribute="trailing" secondItem="Yzu-Z9-ZiH" secondAttribute="trailing" id="bDH-Ez-RfC"/>
<constraint firstAttribute="bottom" secondItem="Yzu-Z9-ZiH" secondAttribute="bottom" id="isZ-Xy-wy3"/>
<constraint firstItem="Yzu-Z9-ZiH" firstAttribute="top" secondItem="OOA-K7-ybj" secondAttribute="top" id="jTM-VI-Bjn"/>
<constraint firstAttribute="height" constant="20" id="jwW-im-ZcM"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Fm-p4-iHv" userLabel="Error box">
<rect key="frame" x="142" y="14" width="166" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Planning..." textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="14" translatesAutoresizingMaskIntoConstraints="NO" id="bZb-KY-Y9r" userLabel="Error">
<rect key="frame" x="0.0" y="0.0" width="166" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.95686274509803915" green="0.2627450980392157" blue="0.21176470588235294" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="routing_planning_error"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="red"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="Ii5-tP-LwY"/>
<constraint firstAttribute="trailing" secondItem="bZb-KY-Y9r" secondAttribute="trailing" id="MQM-kE-YfO"/>
<constraint firstAttribute="bottom" secondItem="bZb-KY-Y9r" secondAttribute="bottom" id="e8n-MD-IUX"/>
<constraint firstItem="bZb-KY-Y9r" firstAttribute="top" secondItem="8Fm-p4-iHv" secondAttribute="top" id="iOX-Kd-geg"/>
<constraint firstItem="bZb-KY-Y9r" firstAttribute="leading" secondItem="8Fm-p4-iHv" secondAttribute="leading" id="oiU-lf-i60"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tjE-md-mqu" userLabel="Result box">
<rect key="frame" x="142" y="14" width="166" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="results" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="14" translatesAutoresizingMaskIntoConstraints="NO" id="v46-iC-Qyb">
<rect key="frame" x="0.0" y="0.0" width="166" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="v46-iC-Qyb" secondAttribute="trailing" id="Abv-X7-oJu"/>
<constraint firstAttribute="height" constant="20" id="Utj-Ne-3Oj"/>
<constraint firstItem="v46-iC-Qyb" firstAttribute="top" secondItem="tjE-md-mqu" secondAttribute="top" id="Zpy-r2-q2u"/>
<constraint firstItem="v46-iC-Qyb" firstAttribute="leading" secondItem="tjE-md-mqu" secondAttribute="leading" id="hdC-c8-ywq"/>
<constraint firstAttribute="bottom" secondItem="v46-iC-Qyb" secondAttribute="bottom" id="x8q-ZY-4Yv"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oQc-l8-sZH" userLabel="Buttons Box">
<rect key="frame" x="8" y="0.0" width="134" height="48"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cZF-Ha-2tB">
<rect key="frame" x="6" y="5" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="38" id="m6k-uU-yOl"/>
<constraint firstAttribute="height" constant="38" id="mp7-b4-xot"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6D3-QF-6wm">
<rect key="frame" x="48" y="5" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="38" id="815-LJ-2tk"/>
<constraint firstAttribute="height" constant="38" id="hXi-E7-GUb"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FuO-c6-y9C" userLabel="Bicycle">
<rect key="frame" x="90" y="5" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="38" id="9fe-fw-05J"/>
<constraint firstAttribute="height" constant="38" id="gbm-NL-zgv"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="FuO-c6-y9C" firstAttribute="centerY" secondItem="oQc-l8-sZH" secondAttribute="centerY" id="1De-4s-V8t"/>
<constraint firstItem="cZF-Ha-2tB" firstAttribute="centerY" secondItem="oQc-l8-sZH" secondAttribute="centerY" id="MQh-op-cpN"/>
<constraint firstItem="cZF-Ha-2tB" firstAttribute="leading" secondItem="oQc-l8-sZH" secondAttribute="leading" constant="6" id="MjU-UA-Kax"/>
<constraint firstAttribute="height" constant="48" id="Mws-KZ-ghs"/>
<constraint firstItem="FuO-c6-y9C" firstAttribute="leading" secondItem="6D3-QF-6wm" secondAttribute="trailing" constant="4" id="kiZ-0X-ufX"/>
<constraint firstItem="6D3-QF-6wm" firstAttribute="leading" secondItem="cZF-Ha-2tB" secondAttribute="trailing" constant="4" id="s0r-iE-aBu"/>
<constraint firstItem="6D3-QF-6wm" firstAttribute="centerY" secondItem="oQc-l8-sZH" secondAttribute="centerY" id="vXO-6g-q4L"/>
<constraint firstAttribute="trailing" secondItem="FuO-c6-y9C" secondAttribute="trailing" constant="6" id="xOE-cB-5a5"/>
<constraint firstItem="6D3-QF-6wm" firstAttribute="centerX" secondItem="oQc-l8-sZH" secondAttribute="centerX" id="zcU-mY-JYz"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="8Fm-p4-iHv" firstAttribute="centerY" secondItem="Sr7-UO-G0z" secondAttribute="centerY" id="6Bj-GR-HOL"/>
<constraint firstItem="OOA-K7-ybj" firstAttribute="centerY" secondItem="Sr7-UO-G0z" secondAttribute="centerY" id="6Uv-dg-Un3"/>
<constraint firstAttribute="trailing" secondItem="tjE-md-mqu" secondAttribute="trailing" priority="999" constant="12" id="99x-Ja-4UF"/>
<constraint firstItem="OOA-K7-ybj" firstAttribute="leading" secondItem="oQc-l8-sZH" secondAttribute="trailing" id="TAE-ae-pa6"/>
<constraint firstItem="tjE-md-mqu" firstAttribute="centerY" secondItem="Sr7-UO-G0z" secondAttribute="centerY" id="ikK-X1-3S9"/>
<constraint firstItem="oQc-l8-sZH" firstAttribute="centerY" secondItem="Sr7-UO-G0z" secondAttribute="centerY" id="jmL-Ol-DwJ"/>
<constraint firstItem="oQc-l8-sZH" firstAttribute="leading" secondItem="Sr7-UO-G0z" secondAttribute="leading" priority="999" constant="8" id="kJx-Hv-da4"/>
<constraint firstItem="8Fm-p4-iHv" firstAttribute="leading" secondItem="oQc-l8-sZH" secondAttribute="trailing" id="pPr-SX-Yd8"/>
<constraint firstAttribute="height" constant="48" id="tZt-LS-raP"/>
<constraint firstAttribute="trailing" secondItem="OOA-K7-ybj" secondAttribute="trailing" priority="999" constant="12" id="uFe-u5-hEf"/>
<constraint firstAttribute="trailing" secondItem="8Fm-p4-iHv" secondAttribute="trailing" priority="999" constant="12" id="wk4-wb-LAg"/>
<constraint firstItem="tjE-md-mqu" firstAttribute="leading" secondItem="oQc-l8-sZH" secondAttribute="trailing" id="yVc-kD-ck6"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.shadowRadius">
<integer key="value" value="2"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="layer.shadowUIColor">
<color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.23999999999999999" colorSpace="calibratedRGB"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="layer.shadowOpacity">
<integer key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="size" keyPath="layer.shadowOffset">
<size key="value" width="0.0" height="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="Sr7-UO-G0z" secondAttribute="trailing" id="9Kt-v8-h57"/>
<constraint firstItem="DMt-LJ-mzn" firstAttribute="centerX" secondItem="aNH-vh-DPz" secondAttribute="centerX" id="KO8-f0-6R5"/>
<constraint firstItem="Sr7-UO-G0z" firstAttribute="leading" secondItem="aNH-vh-DPz" secondAttribute="leading" id="cTv-Jh-D3E"/>
<constraint firstAttribute="trailing" secondItem="WqK-Yb-PmP" secondAttribute="trailing" id="hui-oa-rbV"/>
<constraint firstItem="Sr7-UO-G0z" firstAttribute="top" secondItem="WqK-Yb-PmP" secondAttribute="bottom" id="jw5-OD-IF0"/>
<constraint firstItem="WqK-Yb-PmP" firstAttribute="leading" secondItem="aNH-vh-DPz" secondAttribute="leading" id="rQB-KG-9Kg"/>
<constraint firstItem="WqK-Yb-PmP" firstAttribute="top" secondItem="aNH-vh-DPz" secondAttribute="top" id="u9l-Q9-28D"/>
</constraints>
@ -279,22 +135,17 @@
<outlet property="bicycle" destination="FuO-c6-y9C" id="UR2-pF-Amb"/>
<outlet property="collectionView" destination="DrK-vI-WkO" id="IRr-R5-WIS"/>
<outlet property="contentView" destination="WqK-Yb-PmP" id="4ph-Dm-EFr"/>
<outlet property="errorBox" destination="8Fm-p4-iHv" id="wTj-tn-NrE"/>
<outlet property="extendButton" destination="0YR-3a-ucN" id="fJG-ts-aGf"/>
<outlet property="layout" destination="R9u-Qo-R0Y" id="cqs-S1-d4J"/>
<outlet property="pedestrian" destination="6D3-QF-6wm" id="bdh-zx-9LW"/>
<outlet property="planningBox" destination="OOA-K7-ybj" id="kh6-F2-aBF"/>
<outlet property="planningContainerHeight" destination="tZt-LS-raP" id="jsB-Vh-6KP"/>
<outlet property="planningRouteViewHeight" destination="2SX-TZ-tS3" id="IwX-TA-FxL"/>
<outlet property="resultLabel" destination="v46-iC-Qyb" id="RtF-Gr-uQC"/>
<outlet property="resultsBox" destination="tjE-md-mqu" id="eiV-ww-oCE"/>
<outlet property="vehicle" destination="cZF-Ha-2tB" id="QP3-tU-nfO"/>
</connections>
<point key="canvasLocation" x="448" y="341"/>
</view>
</objects>
<resources>
<image name="ic_arrow_up_and_down" width="9" height="9"/>
<image name="ic_arrow_up_and_down" width="13" height="8"/>
<image name="ic_nav_bar_back" width="14" height="22"/>
</resources>
</document>

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
</dependencies>
<customFonts key="customFonts">
<mutableArray key="HelveticaNeue.ttc">
<string>HelveticaNeue-Medium</string>
<string>HelveticaNeue-Medium</string>
</mutableArray>
</customFonts>
<objects>
@ -35,17 +35,45 @@
<action selector="routingStopTouchUpInside" destination="-1" eventType="touchUpInside" id="DWh-ls-fCL"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Planning Route" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8Q7-PE-2D9">
<rect key="frame" x="100" y="12" width="120" height="21"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="p2p_route_planning"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="whitePrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
</userDefinedRuntimeAttributes>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sXu-tl-a0m" userLabel="Buttons Box">
<rect key="frame" x="75" y="0.0" width="170" height="44"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jDl-pu-eov">
<rect key="frame" x="6" y="0.0" width="44" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" secondItem="jDl-pu-eov" secondAttribute="height" multiplier="1:1" id="o1x-sd-13z"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yiM-fM-sSS" userLabel="Bicycle">
<rect key="frame" x="66" y="0.0" width="44" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" secondItem="yiM-fM-sSS" secondAttribute="height" multiplier="1:1" id="rnk-51-Cjg"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VhE-hA-Leo">
<rect key="frame" x="126" y="3" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" secondItem="VhE-hA-Leo" secondAttribute="height" multiplier="1:1" id="V4H-0m-WCy"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="jDl-pu-eov" firstAttribute="leading" secondItem="sXu-tl-a0m" secondAttribute="leading" constant="6" id="4B3-wd-Hli"/>
<constraint firstItem="VhE-hA-Leo" firstAttribute="leading" secondItem="yiM-fM-sSS" secondAttribute="trailing" constant="16" id="5aG-G0-kVn"/>
<constraint firstItem="VhE-hA-Leo" firstAttribute="top" secondItem="sXu-tl-a0m" secondAttribute="top" constant="3" id="HM9-PQ-ys1"/>
<constraint firstAttribute="bottom" secondItem="jDl-pu-eov" secondAttribute="bottom" id="Icg-Vj-GvT"/>
<constraint firstItem="yiM-fM-sSS" firstAttribute="leading" secondItem="jDl-pu-eov" secondAttribute="trailing" constant="16" id="Ig8-ez-IpI"/>
<constraint firstAttribute="bottom" secondItem="VhE-hA-Leo" secondAttribute="bottom" constant="3" id="Sod-o1-NpK"/>
<constraint firstItem="yiM-fM-sSS" firstAttribute="top" secondItem="sXu-tl-a0m" secondAttribute="top" id="f3J-LS-7YL"/>
<constraint firstAttribute="bottom" secondItem="yiM-fM-sSS" secondAttribute="bottom" id="ipg-GT-aKH"/>
<constraint firstItem="jDl-pu-eov" firstAttribute="top" secondItem="sXu-tl-a0m" secondAttribute="top" id="kzv-U2-zJG"/>
<constraint firstAttribute="trailing" secondItem="VhE-hA-Leo" secondAttribute="trailing" constant="6" id="u9b-RO-eMG"/>
</constraints>
</view>
<collectionView multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="TC0-58-PO9">
<rect key="frame" x="8" y="48" width="304" height="80"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
@ -70,11 +98,12 @@
</subviews>
<color key="backgroundColor" red="0.1215686275" green="0.59999999999999998" blue="0.32156862749999998" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="sXu-tl-a0m" firstAttribute="bottom" secondItem="a4n-5I-PN3" secondAttribute="bottom" id="4NN-cC-Tsg"/>
<constraint firstAttribute="height" constant="140" id="7e9-gc-Y07"/>
<constraint firstItem="8Q7-PE-2D9" firstAttribute="centerY" secondItem="a4n-5I-PN3" secondAttribute="centerY" id="I38-hd-pky"/>
<constraint firstItem="sXu-tl-a0m" firstAttribute="top" secondItem="a4n-5I-PN3" secondAttribute="top" id="J7w-8N-vlf"/>
<constraint firstAttribute="bottom" secondItem="TC0-58-PO9" secondAttribute="bottom" constant="12" id="O8H-Ui-wI9"/>
<constraint firstItem="sXu-tl-a0m" firstAttribute="centerX" secondItem="3s2-BV-X5i" secondAttribute="centerX" id="OeL-MY-Mn5"/>
<constraint firstItem="TC0-58-PO9" firstAttribute="leading" secondItem="3s2-BV-X5i" secondAttribute="leading" constant="8" id="Qnm-Iy-DdA"/>
<constraint firstItem="8Q7-PE-2D9" firstAttribute="centerX" secondItem="3s2-BV-X5i" secondAttribute="centerX" id="TFE-Df-Eri"/>
<constraint firstItem="a4n-5I-PN3" firstAttribute="leading" secondItem="3s2-BV-X5i" secondAttribute="leading" id="Wxp-Yl-6SC"/>
<constraint firstItem="a4n-5I-PN3" firstAttribute="top" secondItem="3s2-BV-X5i" secondAttribute="top" id="ppW-Pq-6rh"/>
<constraint firstAttribute="trailing" secondItem="TC0-58-PO9" secondAttribute="trailing" constant="8" id="yA7-YN-yHs"/>
@ -83,84 +112,14 @@
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="primary"/>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dCk-ko-ZXf" customClass="SolidTouchView">
<rect key="frame" x="0.0" y="140" width="320" height="48"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sXu-tl-a0m" userLabel="Buttons Box">
<rect key="frame" x="70" y="0.0" width="180" height="48"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jDl-pu-eov">
<rect key="frame" x="6" y="5" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="38" id="20g-vX-5Jf"/>
<constraint firstAttribute="width" constant="38" id="glR-Pu-Wba"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VhE-hA-Leo">
<rect key="frame" x="71" y="5" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="38" id="Mjq-9J-kR6"/>
<constraint firstAttribute="height" constant="38" id="mo7-IQ-2Iq"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yiM-fM-sSS" userLabel="Bicycle">
<rect key="frame" x="136" y="5" width="38" height="38"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="38" id="fmv-op-qsf"/>
<constraint firstAttribute="width" constant="38" id="lNf-AN-ghl"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="jDl-pu-eov" firstAttribute="leading" secondItem="sXu-tl-a0m" secondAttribute="leading" constant="6" id="4B3-wd-Hli"/>
<constraint firstItem="jDl-pu-eov" firstAttribute="centerY" secondItem="sXu-tl-a0m" secondAttribute="centerY" id="4dN-qr-d8x"/>
<constraint firstItem="yiM-fM-sSS" firstAttribute="leading" secondItem="VhE-hA-Leo" secondAttribute="trailing" constant="27" id="4dV-co-loq"/>
<constraint firstItem="VhE-hA-Leo" firstAttribute="leading" secondItem="jDl-pu-eov" secondAttribute="trailing" constant="27" id="Dhr-7d-Tja"/>
<constraint firstAttribute="height" constant="48" id="VKo-hu-3qN"/>
<constraint firstAttribute="trailing" secondItem="yiM-fM-sSS" secondAttribute="trailing" constant="6" id="Z9O-Lt-RWP"/>
<constraint firstItem="VhE-hA-Leo" firstAttribute="centerY" secondItem="sXu-tl-a0m" secondAttribute="centerY" id="fIv-2J-AaU"/>
<constraint firstItem="VhE-hA-Leo" firstAttribute="centerX" secondItem="sXu-tl-a0m" secondAttribute="centerX" id="n21-Af-MJF"/>
<constraint firstItem="yiM-fM-sSS" firstAttribute="centerY" secondItem="sXu-tl-a0m" secondAttribute="centerY" id="pyj-0F-ss9"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="sXu-tl-a0m" firstAttribute="centerX" secondItem="dCk-ko-ZXf" secondAttribute="centerX" id="I21-lN-FTQ"/>
<constraint firstItem="sXu-tl-a0m" firstAttribute="centerY" secondItem="dCk-ko-ZXf" secondAttribute="centerY" id="PZW-eT-JxN"/>
<constraint firstAttribute="height" constant="48" id="tiT-C1-uCe"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.shadowRadius">
<integer key="value" value="2"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="layer.shadowUIColor">
<color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.23999999999999999" colorSpace="calibratedRGB"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="layer.shadowOpacity">
<integer key="value" value="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="size" keyPath="layer.shadowOffset">
<size key="value" width="0.0" height="1"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="87p-Qg-8f3" userLabel="Status Box">
<rect key="frame" x="0.0" y="208" width="320" height="56"/>
<rect key="frame" x="0.0" y="176" width="320" height="64"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tdV-a8-fmG" userLabel="Planning Box">
<rect key="frame" x="56" y="18" width="240" height="24"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Planning..." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="14" translatesAutoresizingMaskIntoConstraints="NO" id="a7v-h1-j52">
<rect key="frame" x="0.0" y="0.0" width="240" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="kce-Z6-Dgg"/>
</constraints>
<rect key="frame" x="120" y="22" width="80" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.26000000000000001" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -173,20 +132,15 @@
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="a7v-h1-j52" firstAttribute="leading" secondItem="tdV-a8-fmG" secondAttribute="leading" id="DTZ-EA-SCl"/>
<constraint firstItem="a7v-h1-j52" firstAttribute="top" secondItem="tdV-a8-fmG" secondAttribute="top" id="JtI-PP-1bF"/>
<constraint firstAttribute="trailing" secondItem="a7v-h1-j52" secondAttribute="trailing" id="sD2-h3-W7d"/>
<constraint firstAttribute="height" constant="24" id="urN-wh-uDh"/>
<constraint firstItem="a7v-h1-j52" firstAttribute="centerX" secondItem="tdV-a8-fmG" secondAttribute="centerX" id="L9h-b7-iGd"/>
<constraint firstItem="a7v-h1-j52" firstAttribute="centerY" secondItem="tdV-a8-fmG" secondAttribute="centerY" id="PGc-Ph-A2k"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QEP-6s-YTM" userLabel="Error Box">
<rect key="frame" x="56" y="18" width="240" height="24"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Planning..." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="14" translatesAutoresizingMaskIntoConstraints="NO" id="VNi-4g-9gz" userLabel="Error">
<rect key="frame" x="0.0" y="0.0" width="240" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="cgc-k8-8fa"/>
</constraints>
<rect key="frame" x="120" y="22" width="80" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.95686274510000002" green="0.26274509800000001" blue="0.21176470589999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -199,20 +153,15 @@
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="VNi-4g-9gz" firstAttribute="top" secondItem="QEP-6s-YTM" secondAttribute="top" id="D4E-VN-nEs"/>
<constraint firstAttribute="height" constant="24" id="VAv-Yd-uYh"/>
<constraint firstItem="VNi-4g-9gz" firstAttribute="leading" secondItem="QEP-6s-YTM" secondAttribute="leading" id="Vj2-Td-djJ"/>
<constraint firstAttribute="trailing" secondItem="VNi-4g-9gz" secondAttribute="trailing" id="j6r-43-O3n"/>
<constraint firstItem="VNi-4g-9gz" firstAttribute="centerY" secondItem="QEP-6s-YTM" secondAttribute="centerY" id="bfa-sc-ifi"/>
<constraint firstItem="VNi-4g-9gz" firstAttribute="centerX" secondItem="QEP-6s-YTM" secondAttribute="centerX" id="iKJ-3u-Al9"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rqr-bu-crx" userLabel="Results Box">
<rect key="frame" x="16" y="18" width="280" height="44"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="results" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zml-eW-DsI">
<rect key="frame" x="40" y="0.0" width="240" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="hNE-av-oYA"/>
</constraints>
<rect key="frame" x="16" y="14" width="288" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -221,8 +170,8 @@
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Arrive at 12:24" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oec-Ee-6ha">
<rect key="frame" x="40" y="28" width="240" height="16"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Arrive at 12:24" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oec-Ee-6ha">
<rect key="frame" x="16" y="38" width="288" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -231,34 +180,64 @@
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
</userDefinedRuntimeAttributes>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="ic_checkmark" translatesAutoresizingMaskIntoConstraints="NO" id="pQb-pb-L88">
<rect key="frame" x="0.0" y="10" width="24" height="24"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="coloring" value="MWMBlue"/>
</userDefinedRuntimeAttributes>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="zml-eW-DsI" firstAttribute="top" secondItem="Rqr-bu-crx" secondAttribute="top" id="64F-ka-3rg"/>
<constraint firstAttribute="trailing" secondItem="zml-eW-DsI" secondAttribute="trailing" id="jkC-ab-eb2"/>
<constraint firstItem="zml-eW-DsI" firstAttribute="leading" secondItem="Rqr-bu-crx" secondAttribute="leading" constant="40" id="qVK-7N-2cB"/>
<constraint firstAttribute="height" constant="44" id="xv6-UW-2NC"/>
<constraint firstItem="oec-Ee-6ha" firstAttribute="leading" secondItem="zml-eW-DsI" secondAttribute="leading" id="Am2-25-Zn9"/>
<constraint firstAttribute="trailing" secondItem="zml-eW-DsI" secondAttribute="trailing" constant="16" id="DRW-GJ-PG9"/>
<constraint firstItem="zml-eW-DsI" firstAttribute="leading" secondItem="Rqr-bu-crx" secondAttribute="leading" constant="16" id="QNo-az-LlD"/>
<constraint firstAttribute="height" constant="64" id="bHW-iR-rAA"/>
<constraint firstItem="zml-eW-DsI" firstAttribute="top" secondItem="Rqr-bu-crx" secondAttribute="top" constant="14" id="c1k-EY-nwQ"/>
<constraint firstItem="oec-Ee-6ha" firstAttribute="top" secondItem="zml-eW-DsI" secondAttribute="bottom" constant="4" id="lV9-S0-yy4"/>
<constraint firstItem="oec-Ee-6ha" firstAttribute="trailing" secondItem="zml-eW-DsI" secondAttribute="trailing" id="rfO-2Z-g12"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6iM-A6-4JK" userLabel="Height Box">
<rect key="frame" x="0.0" y="64" width="320" height="68"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Apa-nH-KWJ">
<rect key="frame" x="16" y="14" width="288" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="zhI-92-6JG">
<rect key="frame" x="0.0" y="0.0" width="288" height="40"/>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="zhI-92-6JG" firstAttribute="top" secondItem="Apa-nH-KWJ" secondAttribute="top" id="7CP-bg-Id3"/>
<constraint firstAttribute="bottom" secondItem="zhI-92-6JG" secondAttribute="bottom" id="LeB-Rl-mPU"/>
<constraint firstItem="zhI-92-6JG" firstAttribute="leading" secondItem="Apa-nH-KWJ" secondAttribute="leading" id="OuL-Na-mKo"/>
<constraint firstAttribute="trailing" secondItem="zhI-92-6JG" secondAttribute="trailing" id="y82-L8-vTL"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="Apa-nH-KWJ" secondAttribute="bottom" constant="14" id="8P4-RM-XZb"/>
<constraint firstAttribute="height" constant="68" id="Fl4-Tb-OER"/>
<constraint firstItem="Apa-nH-KWJ" firstAttribute="top" secondItem="6iM-A6-4JK" secondAttribute="top" constant="14" id="TNG-pv-uE8"/>
<constraint firstAttribute="trailing" secondItem="Apa-nH-KWJ" secondAttribute="trailing" constant="16" id="XSN-g6-2W4"/>
<constraint firstItem="Apa-nH-KWJ" firstAttribute="leading" secondItem="6iM-A6-4JK" secondAttribute="leading" constant="16" id="cR5-Kq-pEJ"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="QEP-6s-YTM" secondAttribute="trailing" constant="24" id="3j3-fg-BQI"/>
<constraint firstAttribute="height" constant="56" id="4qT-ha-p75"/>
<constraint firstItem="tdV-a8-fmG" firstAttribute="top" secondItem="87p-Qg-8f3" secondAttribute="top" constant="18" id="9k0-qk-CIy"/>
<constraint firstItem="Rqr-bu-crx" firstAttribute="leading" secondItem="87p-Qg-8f3" secondAttribute="leading" constant="16" id="QE7-5e-hao"/>
<constraint firstItem="tdV-a8-fmG" firstAttribute="leading" secondItem="87p-Qg-8f3" secondAttribute="leading" constant="56" id="eId-mI-aTk"/>
<constraint firstAttribute="trailing" secondItem="Rqr-bu-crx" secondAttribute="trailing" constant="24" id="eWu-5d-rwV"/>
<constraint firstItem="Rqr-bu-crx" firstAttribute="top" secondItem="87p-Qg-8f3" secondAttribute="top" constant="18" id="gCE-au-jty"/>
<constraint firstItem="QEP-6s-YTM" firstAttribute="top" secondItem="87p-Qg-8f3" secondAttribute="top" constant="18" id="pQh-mf-RQ7"/>
<constraint firstAttribute="trailing" secondItem="tdV-a8-fmG" secondAttribute="trailing" constant="24" id="wOw-dF-lsK"/>
<constraint firstItem="QEP-6s-YTM" firstAttribute="leading" secondItem="87p-Qg-8f3" secondAttribute="leading" constant="56" id="xIy-mT-cu9"/>
<constraint firstItem="tdV-a8-fmG" firstAttribute="leading" secondItem="Rqr-bu-crx" secondAttribute="leading" id="1s7-bh-347"/>
<constraint firstAttribute="height" constant="64" id="4qT-ha-p75"/>
<constraint firstItem="QEP-6s-YTM" firstAttribute="top" secondItem="Rqr-bu-crx" secondAttribute="top" id="7qG-zS-yqf"/>
<constraint firstItem="6iM-A6-4JK" firstAttribute="trailing" secondItem="Rqr-bu-crx" secondAttribute="trailing" id="BdC-p6-tnB"/>
<constraint firstItem="Rqr-bu-crx" firstAttribute="leading" secondItem="87p-Qg-8f3" secondAttribute="leading" id="Fkj-U2-xyQ"/>
<constraint firstItem="6iM-A6-4JK" firstAttribute="leading" secondItem="Rqr-bu-crx" secondAttribute="leading" id="K40-dq-JmP"/>
<constraint firstItem="Rqr-bu-crx" firstAttribute="top" secondItem="87p-Qg-8f3" secondAttribute="top" id="N7H-ZL-K7y"/>
<constraint firstAttribute="trailing" secondItem="Rqr-bu-crx" secondAttribute="trailing" id="QH4-pv-oKn"/>
<constraint firstItem="QEP-6s-YTM" firstAttribute="bottom" secondItem="Rqr-bu-crx" secondAttribute="bottom" id="SmI-QQ-bUn"/>
<constraint firstItem="QEP-6s-YTM" firstAttribute="trailing" secondItem="Rqr-bu-crx" secondAttribute="trailing" id="Ttu-kY-vjH"/>
<constraint firstItem="tdV-a8-fmG" firstAttribute="top" secondItem="Rqr-bu-crx" secondAttribute="top" id="axQ-FJ-jAM"/>
<constraint firstItem="tdV-a8-fmG" firstAttribute="bottom" secondItem="Rqr-bu-crx" secondAttribute="bottom" id="d05-rK-0iZ"/>
<constraint firstItem="tdV-a8-fmG" firstAttribute="trailing" secondItem="Rqr-bu-crx" secondAttribute="trailing" id="fP8-Fd-bYt"/>
<constraint firstItem="6iM-A6-4JK" firstAttribute="top" secondItem="Rqr-bu-crx" secondAttribute="bottom" id="gCd-UZ-my5"/>
<constraint firstItem="QEP-6s-YTM" firstAttribute="leading" secondItem="Rqr-bu-crx" secondAttribute="leading" id="tfA-kG-wTD"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="layer.borderUIColor">
@ -273,8 +252,8 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gcR-zj-b7P">
<rect key="frame" x="0.0" y="607" width="320" height="48"/>
<subviews>
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4IJ-pR-Ztp" userLabel="Go" customClass="MWMStartButton">
<rect key="frame" x="100" y="8" width="120" height="32"/>
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4IJ-pR-Ztp" userLabel="Go" customClass="MWMStartButton">
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
<accessibility key="accessibilityConfiguration" identifier="goButton"/>
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
<state key="normal" title="Start"/>
@ -283,9 +262,6 @@
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="4"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="p2p_start"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
@ -299,6 +275,10 @@
<color key="backgroundColor" red="1" green="1" blue="1" alpha="0.80000000000000004" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="48" id="5GN-4g-vV1"/>
<constraint firstAttribute="trailing" secondItem="4IJ-pR-Ztp" secondAttribute="trailing" id="ML1-Xc-dlH"/>
<constraint firstItem="4IJ-pR-Ztp" firstAttribute="top" secondItem="gcR-zj-b7P" secondAttribute="top" id="O3s-Ji-gI9"/>
<constraint firstItem="4IJ-pR-Ztp" firstAttribute="leading" secondItem="gcR-zj-b7P" secondAttribute="leading" id="VKp-pp-FKT"/>
<constraint firstAttribute="bottom" secondItem="4IJ-pR-Ztp" secondAttribute="bottom" id="iof-B4-bI3"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="layer.borderUIColor">
@ -316,15 +296,12 @@
<constraint firstItem="gcR-zj-b7P" firstAttribute="leading" secondItem="u2u-Vb-2eH" secondAttribute="leading" id="1RD-kG-W2O"/>
<constraint firstAttribute="trailing" secondItem="87p-Qg-8f3" secondAttribute="trailing" id="5wh-lx-rUz"/>
<constraint firstItem="3s2-BV-X5i" firstAttribute="top" secondItem="u2u-Vb-2eH" secondAttribute="top" id="8Qb-GY-2hU"/>
<constraint firstItem="87p-Qg-8f3" firstAttribute="top" secondItem="3s2-BV-X5i" secondAttribute="bottom" constant="36" id="8nt-tf-wyq"/>
<constraint firstItem="87p-Qg-8f3" firstAttribute="leading" secondItem="u2u-Vb-2eH" secondAttribute="leading" id="9bA-9R-pwq"/>
<constraint firstAttribute="bottom" secondItem="gcR-zj-b7P" secondAttribute="bottom" id="QYs-r4-Jyl"/>
<constraint firstItem="87p-Qg-8f3" firstAttribute="top" secondItem="dCk-ko-ZXf" secondAttribute="bottom" constant="20" id="Wdh-lF-PT4"/>
<constraint firstAttribute="trailing" secondItem="dCk-ko-ZXf" secondAttribute="trailing" id="ZuD-Xf-f8d"/>
<constraint firstItem="3s2-BV-X5i" firstAttribute="leading" secondItem="u2u-Vb-2eH" secondAttribute="leading" id="e90-R4-YQR"/>
<constraint firstAttribute="trailing" secondItem="3s2-BV-X5i" secondAttribute="trailing" id="lnu-7l-aPG"/>
<constraint firstAttribute="trailing" secondItem="gcR-zj-b7P" secondAttribute="trailing" id="n9j-dG-kOB"/>
<constraint firstItem="dCk-ko-ZXf" firstAttribute="leading" secondItem="u2u-Vb-2eH" secondAttribute="leading" id="t6m-zB-7rK"/>
<constraint firstItem="dCk-ko-ZXf" firstAttribute="top" secondItem="3s2-BV-X5i" secondAttribute="bottom" id="uv5-No-Ghd"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
@ -348,24 +325,26 @@
<outlet property="backButton" destination="a4n-5I-PN3" id="42W-5B-Z8i"/>
<outlet property="bicycle" destination="yiM-fM-sSS" id="pMf-6J-9Gd"/>
<outlet property="collectionView" destination="TC0-58-PO9" id="Onv-Ld-JPp"/>
<outlet property="completeImageView" destination="pQb-pb-L88" id="FAi-yN-HNc"/>
<outlet property="contentView" destination="3s2-BV-X5i" id="mp7-Qq-drU"/>
<outlet property="errorBox" destination="QEP-6s-YTM" id="kH0-yP-1Gk"/>
<outlet property="goButton" destination="4IJ-pR-Ztp" id="48a-At-Nqq"/>
<outlet property="heightBox" destination="6iM-A6-4JK" id="cav-Cj-Aqr"/>
<outlet property="heightBoxHeight" destination="Fl4-Tb-OER" id="MEr-ms-WF4"/>
<outlet property="heightProfileImage" destination="zhI-92-6JG" id="BAQ-2W-WFu"/>
<outlet property="layout" destination="YwC-vB-4LF" id="Hta-la-OdY"/>
<outlet property="pedestrian" destination="VhE-hA-Leo" id="R3O-th-Jw0"/>
<outlet property="planningBox" destination="tdV-a8-fmG" id="dR4-f7-H2J"/>
<outlet property="resultLabel" destination="zml-eW-DsI" id="GaF-AU-thr"/>
<outlet property="resultsBox" destination="Rqr-bu-crx" id="MgA-Aj-m5e"/>
<outlet property="resultsBoxHeight" destination="bHW-iR-rAA" id="gtD-94-xk7"/>
<outlet property="statusBox" destination="87p-Qg-8f3" id="mSF-4e-CPU"/>
<outlet property="statusBoxHeight" destination="4qT-ha-p75" id="Ias-po-Adc"/>
<outlet property="statusBoxHeight" destination="4qT-ha-p75" id="e6i-4p-0cu"/>
<outlet property="vehicle" destination="jDl-pu-eov" id="awM-KI-2xO"/>
</connections>
<point key="canvasLocation" x="448" y="574"/>
</view>
</objects>
<resources>
<image name="ic_checkmark" width="28" height="28"/>
<image name="ic_nav_bar_back" width="14" height="22"/>
</resources>
</document>

View file

@ -1,2 +1,3 @@
typedef void (^TMWMVoidBlock)();
typedef void (^MWMStringBlock)(NSString *);
typedef void (^MWMImageBlock)(UIImage *);

View file

@ -6,6 +6,8 @@
+ (MWMRouter *)router;
+ (BOOL)hasRouteAltitude;
@property(nonatomic, readonly) MWMRoutePoint startPoint;
@property(nonatomic, readonly) MWMRoutePoint finishPoint;
@property(nonatomic) routing::RouterType type;
@ -19,6 +21,7 @@
- (void)rebuildWithBestRouter:(BOOL)bestRouter;
- (void)start;
- (void)stop;
- (void)routeAltitudeImageForSize:(CGSize)size completion:(MWMImageBlock)block;
- (instancetype)init __attribute__((unavailable("call +router instead")));
- (instancetype)copy __attribute__((unavailable("call +router instead")));

View file

@ -14,6 +14,7 @@
#import "MapViewController.h"
#import "MapsAppDelegate.h"
#import "Statistics.h"
#import "UIImage+RGBAData.h"
#include "Framework.h"
@ -23,6 +24,8 @@ using namespace routing;
namespace
{
char const * kRenderAltitudeImagesQueueLabel = "mapsme.mwmrouter.renderAltitudeImagesQueue";
MWMRoutePoint lastLocationPoint()
{
CLLocation * lastLocation = [MWMLocationManager lastLocation];
@ -37,6 +40,9 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
@property(nonatomic, readwrite) MWMRoutePoint startPoint;
@property(nonatomic, readwrite) MWMRoutePoint finishPoint;
@property(nonatomic) NSMutableDictionary<NSValue *, NSData *> * altitudeImagesData;
@property(nonatomic) dispatch_queue_t renderAltitudeImagesQueue;
@end
@implementation MWMRouter
@ -51,11 +57,15 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
return router;
}
+ (BOOL)hasRouteAltitude { return GetFramework().HasRouteAltitude(); }
- (instancetype)initRouter
{
self = [super init];
if (self)
{
self.altitudeImagesData = [@{} mutableCopy];
self.renderAltitudeImagesQueue =
dispatch_queue_create(kRenderAltitudeImagesQueueLabel, DISPATCH_QUEUE_SERIAL);
[self resetPoints];
[MWMLocationManager addObserver:self];
[MWMFrameworkListener addObserver:self];
@ -119,6 +129,8 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
- (void)rebuildWithBestRouter:(BOOL)bestRouter
{
[self clearAltitudeImagesData];
if (self.startPoint.IsMyPosition())
{
[Statistics logEvent:kStatPointToPoint
@ -237,6 +249,7 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
- (void)doStop
{
[self clearAltitudeImagesData];
GetFramework().CloseRouting();
MapsAppDelegate * app = [MapsAppDelegate theApp];
app.routingPlaneMode = MWMRoutingPlaneModeNone;
@ -257,6 +270,49 @@ bool isMarkerPoint(MWMRoutePoint const & point) { return point.IsValid() && !poi
[[MWMNavigationDashboardManager manager] updateFollowingInfo:info];
}
- (void)routeAltitudeImageForSize:(CGSize)size completion:(MWMImageBlock)block
{
dispatch_async(self.renderAltitudeImagesQueue, ^{
if (![MWMRouter hasRouteAltitude])
return;
CGFloat const screenScale = [UIScreen mainScreen].scale;
CGSize const scaledSize = {.width = size.width * screenScale,
.height = size.height * screenScale};
uint32_t const width = static_cast<uint32_t>(scaledSize.width);
uint32_t const height = static_cast<uint32_t>(scaledSize.height);
if (width == 0 || height == 0)
return;
NSValue * sizeValue = [NSValue valueWithCGSize:scaledSize];
NSData * imageData = self.altitudeImagesData[sizeValue];
if (!imageData)
{
vector<uint8_t> imageRGBAData;
if (!GetFramework().GenerateRouteAltitudeChart(width, height, imageRGBAData))
return;
if (imageRGBAData.empty())
return;
imageData = [NSData dataWithBytes:imageRGBAData.data() length:imageRGBAData.size()];
self.altitudeImagesData[sizeValue] = imageData;
}
UIImage * altitudeImage = [UIImage imageWithRGBAData:imageData width:width height:height];
if (altitudeImage)
{
dispatch_async(dispatch_get_main_queue(), ^{
block(altitudeImage);
});
}
});
}
- (void)clearAltitudeImagesData
{
dispatch_async(self.renderAltitudeImagesQueue, ^{
[self.altitudeImagesData removeAllObjects];
});
}
#pragma mark - MWMLocationObserver
- (void)onLocationUpdate:(location::GpsInfo const &)info

View file

@ -2,17 +2,17 @@
"images" : [
{
"idiom" : "universal",
"filename" : "ic_arrow_up_and_down.png",
"filename" : "icArrowDown.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_arrow_up_and_down@2x.png",
"filename" : "icArrowDown@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_arrow_up_and_down@3x.png",
"filename" : "icArrowDown@3x.png",
"scale" : "3x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

View file

@ -313,6 +313,8 @@
34DCDE3B1C75CE1F00652CAC /* MWMOpeningHoursDeleteScheduleTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 347FD85A1C60B2CE002FB65E /* MWMOpeningHoursDeleteScheduleTableViewCell.mm */; };
34DDD5341BFDB0B600407F2F /* MWMMapDownloaderViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 342AF0DF1BE24E9A0016F3AE /* MWMMapDownloaderViewController.mm */; };
34DDD5351BFDB0C600407F2F /* MWMBaseMapDownloaderViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 341223BA1BEB58FA007227E9 /* MWMBaseMapDownloaderViewController.mm */; };
34E0B8491D7EED0C00735786 /* UIImage+RGBAData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34E0B8481D7EED0C00735786 /* UIImage+RGBAData.mm */; };
34E0B84A1D7EED0C00735786 /* UIImage+RGBAData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34E0B8481D7EED0C00735786 /* UIImage+RGBAData.mm */; };
34E0EECE1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34E0EECC1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.mm */; };
34E0EECF1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34E0EECC1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.mm */; };
34E0EED01CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34E0EECD1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.xib */; };
@ -1206,6 +1208,8 @@
34D37E151CD2373C001DEFC3 /* MWMMapDownloaderCellHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderCellHeader.h; sourceTree = "<group>"; };
34D37E161CD2373C001DEFC3 /* MWMMapDownloaderCellHeader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapDownloaderCellHeader.mm; sourceTree = "<group>"; };
34DCDE3D1C76195F00652CAC /* MWMMapDownloaderProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderProtocol.h; sourceTree = "<group>"; };
34E0B8471D7EEC2A00735786 /* UIImage+RGBAData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIImage+RGBAData.h"; sourceTree = "<group>"; };
34E0B8481D7EED0C00735786 /* UIImage+RGBAData.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UIImage+RGBAData.mm"; sourceTree = "<group>"; };
34E0EECA1CC4F36B008E4919 /* MWMMapDownloaderTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderTypes.h; sourceTree = "<group>"; };
34E0EECB1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderButtonTableViewCell.h; sourceTree = "<group>"; };
34E0EECC1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapDownloaderButtonTableViewCell.mm; sourceTree = "<group>"; };
@ -2566,6 +2570,8 @@
F64DA8011C524BDE00330E9E /* UISwitch+RuntimeAttributes.m */,
34FED54E1D21121000183B1B /* CLLocation+Mercator.h */,
34FED54F1D21121000183B1B /* CLLocation+Mercator.mm */,
34E0B8471D7EEC2A00735786 /* UIImage+RGBAData.h */,
34E0B8481D7EED0C00735786 /* UIImage+RGBAData.mm */,
);
name = Categories;
sourceTree = "<group>";
@ -3663,6 +3669,7 @@
342EE4111C43DAA7009F6A49 /* MWMAuthorizationWebViewLoginViewController.mm in Sources */,
3438CDFC1B862F5C0051AA78 /* MWMSearchContentView.mm in Sources */,
34479C7C1C60C6130065D261 /* MWMFrameworkListener.mm in Sources */,
34E0B8491D7EED0C00735786 /* UIImage+RGBAData.mm in Sources */,
3485C0121B85C20E00F7712D /* MWMSearchTableViewController.mm in Sources */,
345A2DCB1D0B0EB600A7DD39 /* MWMWhatsNewBookingBicycleRoutingController.mm in Sources */,
34D37E171CD2373C001DEFC3 /* MWMMapDownloaderCellHeader.mm in Sources */,
@ -3891,6 +3898,7 @@
F6791B141C43DF0B007A8A6E /* MWMStartButton.mm in Sources */,
34DDD5351BFDB0C600407F2F /* MWMBaseMapDownloaderViewController.mm in Sources */,
6741A9CE1BF340DE002C974C /* MWMSearchManager.mm in Sources */,
34E0B84A1D7EED0C00735786 /* UIImage+RGBAData.mm in Sources */,
F64D9CA01C899C350063FA30 /* MWMEditorViralAlert.mm in Sources */,
345A2DCC1D0B0EB600A7DD39 /* MWMWhatsNewBookingBicycleRoutingController.mm in Sources */,
34D37E181CD2373C001DEFC3 /* MWMMapDownloaderCellHeader.mm in Sources */,

View file

@ -24,6 +24,7 @@
+ (UIColor *)blackDividers;
+ (UIColor *)white;
+ (UIColor *)whitePrimaryText;
+ (UIColor *)whitePrimaryTextHighlighted;
+ (UIColor *)whiteSecondaryText;
+ (UIColor *)whiteHintText;
+ (UIColor *)whiteDividers;

View file

@ -0,0 +1,5 @@
@interface UIImage (RGBAData)
+ (UIImage *)imageWithRGBAData:(NSData *)data width:(size_t)width height:(size_t)height;
@end

View file

@ -0,0 +1,28 @@
#import "UIImage+RGBAData.h"
@implementation UIImage (RGBAData)
+ (UIImage *)imageWithRGBAData:(NSData *)data width:(size_t)width height:(size_t)height
{
size_t constexpr bytesPerPixel = 4;
size_t constexpr bitsPerComponent = 8;
size_t constexpr bitsPerPixel = bitsPerComponent * bytesPerPixel;
size_t const bytesPerRow = bytesPerPixel * width;
bool constexpr shouldInterpolate = true;
CGBitmapInfo constexpr bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data.bytes, height * bytesPerRow, NULL);
CGImageRef cgImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, provider, NULL, shouldInterpolate, kCGRenderingIntentDefault);
UIImage * image = [UIImage imageWithCGImage:cgImage];
CGColorSpaceRelease(colorSpace);
CGDataProviderRelease(provider);
CGImageRelease(cgImage);
return image;
}
@end

View file

@ -11,6 +11,8 @@
342D833B1D5233E8000D8AEA /* displacement_mode_manager.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 342D83391D5233E8000D8AEA /* displacement_mode_manager.hpp */; };
34583BCF1C88556800F94664 /* place_page_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34583BCD1C88556800F94664 /* place_page_info.cpp */; };
34583BD01C88556800F94664 /* place_page_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 34583BCE1C88556800F94664 /* place_page_info.hpp */; };
348AB57C1D7EE0C6009F8301 /* chart_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 348AB57A1D7EE0C6009F8301 /* chart_generator.cpp */; };
348AB57D1D7EE0C6009F8301 /* chart_generator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 348AB57B1D7EE0C6009F8301 /* chart_generator.hpp */; };
34921F661BFA0A6900737D6E /* api_mark_point.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 34921F611BFA0A6900737D6E /* api_mark_point.hpp */; };
45201E931CE4AC90008A4842 /* api_mark_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45201E921CE4AC90008A4842 /* api_mark_point.cpp */; };
670E39401C46C5C700E9C0A6 /* gps_tracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670E393E1C46C5C700E9C0A6 /* gps_tracker.cpp */; };
@ -100,14 +102,6 @@
F6B283081C1B03320081957A /* gps_track_storage.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6B283001C1B03320081957A /* gps_track_storage.hpp */; };
F6B283091C1B03320081957A /* gps_track.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6B283011C1B03320081957A /* gps_track.cpp */; };
F6B2830A1C1B03320081957A /* gps_track.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6B283021C1B03320081957A /* gps_track.hpp */; };
F6DA2A951CCE24DA00F087B5 /* libdrape.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 674A29F61B26FE62001A525C /* libdrape.a */; };
F6DA2A971CCE24DB00F087B5 /* libdrape_frontend.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A961CCE24DB00F087B5 /* libdrape_frontend.a */; };
F6DA2A9E1CCE252600F087B5 /* libeditor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A981CCE252600F087B5 /* libeditor.a */; };
F6DA2A9F1CCE252600F087B5 /* liboauthcpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A991CCE252600F087B5 /* liboauthcpp.a */; };
F6DA2AA01CCE252600F087B5 /* libplatform_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A9A1CCE252600F087B5 /* libplatform_tests_support.a */; };
F6DA2AA11CCE252600F087B5 /* libpugixml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A9B1CCE252600F087B5 /* libpugixml.a */; };
F6DA2AA21CCE252600F087B5 /* libsdf_image.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A9C1CCE252600F087B5 /* libsdf_image.a */; };
F6DA2AA31CCE252600F087B5 /* libstb_image.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6DA2A9D1CCE252600F087B5 /* libstb_image.a */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -127,6 +121,8 @@
342D83391D5233E8000D8AEA /* displacement_mode_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = displacement_mode_manager.hpp; sourceTree = "<group>"; };
34583BCD1C88556800F94664 /* place_page_info.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = place_page_info.cpp; sourceTree = "<group>"; };
34583BCE1C88556800F94664 /* place_page_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = place_page_info.hpp; sourceTree = "<group>"; };
348AB57A1D7EE0C6009F8301 /* chart_generator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chart_generator.cpp; sourceTree = "<group>"; };
348AB57B1D7EE0C6009F8301 /* chart_generator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = chart_generator.hpp; sourceTree = "<group>"; };
34921F611BFA0A6900737D6E /* api_mark_point.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = api_mark_point.hpp; sourceTree = "<group>"; };
45201E921CE4AC90008A4842 /* api_mark_point.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = api_mark_point.cpp; sourceTree = "<group>"; };
670D05A41B0DF4250013A7AC /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = "<group>"; };
@ -389,6 +385,8 @@
675345BD1A4054AD00A0A8C3 /* map */ = {
isa = PBXGroup;
children = (
348AB57A1D7EE0C6009F8301 /* chart_generator.cpp */,
348AB57B1D7EE0C6009F8301 /* chart_generator.hpp */,
342D83381D5233E8000D8AEA /* displacement_mode_manager.cpp */,
342D83391D5233E8000D8AEA /* displacement_mode_manager.hpp */,
34583BCD1C88556800F94664 /* place_page_info.cpp */,
@ -451,6 +449,7 @@
34921F661BFA0A6900737D6E /* api_mark_point.hpp in Headers */,
675346751A4054E800A0A8C3 /* mwm_url.hpp in Headers */,
6753464B1A4054E800A0A8C3 /* bookmark.hpp in Headers */,
348AB57D1D7EE0C6009F8301 /* chart_generator.hpp in Headers */,
6753469E1A4054E800A0A8C3 /* user_mark_container.hpp in Headers */,
675346491A4054E800A0A8C3 /* bookmark_manager.hpp in Headers */,
F6B2830A1C1B03320081957A /* gps_track.hpp in Headers */,
@ -575,6 +574,7 @@
674C38621BFF3095000D603B /* user_mark.cpp in Sources */,
675346641A4054E800A0A8C3 /* framework.cpp in Sources */,
6753466A1A4054E800A0A8C3 /* geourl_process.cpp in Sources */,
348AB57C1D7EE0C6009F8301 /* chart_generator.cpp in Sources */,
342D833A1D5233E8000D8AEA /* displacement_mode_manager.cpp in Sources */,
45201E931CE4AC90008A4842 /* api_mark_point.cpp in Sources */,
675346661A4054E800A0A8C3 /* ge0_parser.cpp in Sources */,