Merge pull request #3373 from igrechuhin/MAPSME-1374

[ios] Added bicycle routing support.
This commit is contained in:
Vladimir Byko-Ianko 2016-05-31 15:50:18 +03:00
commit 6a844a067e
11 changed files with 195 additions and 135 deletions

View file

@ -30,7 +30,7 @@ typedef NS_ENUM(NSUInteger, MWMNavigationDashboardState)
@class MWMNavigationDashboardEntity;
@interface MWMNavigationDashboardManager : NSObject <LocationObserver, MWMCircularProgressProtocol>
@interface MWMNavigationDashboardManager : NSObject <LocationObserver>
@property (nonatomic, readonly) MWMNavigationDashboardEntity * entity;
@property (weak, nonatomic, readonly) MWMRoutePreview * routePreview;
@ -47,6 +47,7 @@ typedef NS_ENUM(NSUInteger, MWMNavigationDashboardState)
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation;
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator;
- (void)setActiveRouter:(routing::RouterType)routerType;
- (void)setRouteBuilderProgress:(CGFloat)progress;
- (void)showHelperPanels;
- (void)hideHelperPanels;

View file

@ -27,7 +27,7 @@ extern NSString * const kTTSStatusWasChangedNotification;
@property (nonatomic) IBOutlet MWMNavigationDashboard * navigationDashboardLandscape;
@property (nonatomic) IBOutlet MWMNavigationDashboard * navigationDashboardPortrait;
@property (weak, nonatomic) MWMNavigationDashboard * navigationDashboard;
@property (weak, nonatomic) MWMCircularProgress * activeRouteTypeButton;
@property (nonatomic) routing::RouterType activeRouterType;
@property (weak, nonatomic) UIView * ownerView;
@ -160,7 +160,7 @@ extern NSString * const kTTSStatusWasChangedNotification;
- (void)handleError
{
[self.routePreview stateError];
self.activeRouteTypeButton.state = MWMCircularProgressStateFailed;
[self.routePreview router:self.activeRouterType setState:MWMCircularProgressStateFailed];
}
- (void)updateDashboard
@ -228,41 +228,18 @@ extern NSString * const kTTSStatusWasChangedNotification;
panel.hidden = YES;
}
#pragma mark - MWMCircularProgressDelegate
#pragma mark - MWMRoutePreviewProtocol
- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress
- (void)setActiveRouter:(routing::RouterType)routerType
{
[Statistics logEvent:kStatEventName(kStatNavigationDashboard, kStatButton)
withParameters:@{kStatValue : kStatProgress}];
MWMCircularProgressState const s = progress.state;
if (s == MWMCircularProgressStateSelected || s == MWMCircularProgressStateCompleted)
return;
self.activeRouteTypeButton = progress;
self.activeRouterType = routerType;
auto & f = GetFramework();
routing::RouterType type;
if ([progress isEqual:self.routePreview.pedestrianProgress])
{
[Statistics
logEvent:kStatPointToPoint
withParameters:@{kStatAction : kStatChangeRoutingMode, kStatValue : kStatPedestrian}];
self.routePreview.vehicleProgress.state = MWMCircularProgressStateNormal;
type = routing::RouterType::Pedestrian;
}
else
{
[Statistics
logEvent:kStatPointToPoint
withParameters:@{kStatAction : kStatChangeRoutingMode, kStatValue : kStatVehicle}];
self.routePreview.pedestrianProgress.state = MWMCircularProgressStateNormal;
type = routing::RouterType::Vehicle;
}
f.CloseRouting();
f.SetRouter(type);
f.SetLastUsedRouter(type);
[self.routePreview selectProgress:progress];
f.SetRouter(routerType);
f.SetLastUsedRouter(routerType);
if (!self.delegate.isPossibleToBuildRoute)
return;
progress.state = MWMCircularProgressStateSpinner;
[self.routePreview router:routerType setState:MWMCircularProgressStateSpinner];
[self.delegate buildRoute];
}
@ -270,7 +247,7 @@ extern NSString * const kTTSStatusWasChangedNotification;
- (void)setRouteBuilderProgress:(CGFloat)progress
{
[self.activeRouteTypeButton setProgress:progress / 100.];
[self.routePreview router:self.activeRouterType setProgress:progress / 100.];
}
#pragma mark - MWMNavigationDashboard
@ -333,7 +310,7 @@ extern NSString * const kTTSStatusWasChangedNotification;
[self removePanel:self.nextTurnPanel];
// [self removePanel:self.lanesPanel];
[self setupActualRoute];
self.activeRouteTypeButton.state = MWMCircularProgressStateSpinner;
[self.routePreview router:self.activeRouterType setState:MWMCircularProgressStateSpinner];
}
- (void)showStateReady
@ -359,18 +336,8 @@ extern NSString * const kTTSStatusWasChangedNotification;
- (void)setupActualRoute
{
switch (GetFramework().GetRouter())
{
case routing::RouterType::Pedestrian:
self.activeRouteTypeButton = self.routePreview.pedestrianProgress;
break;
case routing::RouterType::Vehicle:
self.activeRouteTypeButton = self.routePreview.vehicleProgress;
break;
case routing::RouterType::Bicycle:
break;
}
[self.routePreview selectProgress:self.activeRouteTypeButton];
self.activeRouterType = GetFramework().GetRouter();
[self.routePreview selectRouter:self.activeRouterType];
}
- (void)mwm_refreshUI

View file

@ -1,5 +1,7 @@
#import "MWMNavigationView.h"
#include "routing/router.hpp"
@protocol MWMRoutePreviewDataSource <NSObject>
@required
@ -19,15 +21,14 @@
@property (weak, nonatomic) id<MWMRoutePreviewDataSource> dataSource;
@property (weak, nonatomic) MWMNavigationDashboardManager * dashboardManager;
- (MWMCircularProgress *)pedestrianProgress;
- (MWMCircularProgress *)vehicleProgress;
- (void)configureWithEntity:(MWMNavigationDashboardEntity *)entity;
- (void)statePrepare;
- (void)statePlanning;
- (void)stateError;
- (void)stateReady;
- (void)reloadData;
- (void)selectProgress:(MWMCircularProgress *)progress;
- (void)selectRouter:(routing::RouterType)routerType;
- (void)router:(routing::RouterType)routerType setState:(MWMCircularProgressState)state;
- (void)router:(routing::RouterType)routerType setProgress:(CGFloat)progress;
@end

View file

@ -12,10 +12,11 @@
static CGFloat const kAdditionalHeight = 20.;
@interface MWMRoutePreview () <MWMRoutePointCellDelegate>
@interface MWMRoutePreview () <MWMRoutePointCellDelegate, MWMCircularProgressProtocol>
@property (weak, nonatomic) IBOutlet UIView * pedestrian;
@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;
@ -36,12 +37,12 @@ static CGFloat const kAdditionalHeight = 20.;
@property (nonatomic) BOOL isNeedToMove;
@property (nonatomic) NSIndexPath * indexPathOfMovingCell;
@property (nonatomic, readwrite) MWMCircularProgress * pedestrianProgress;
@property (nonatomic, readwrite) MWMCircularProgress * vehicleProgress;
@end
@implementation MWMRoutePreview
{
map<routing::RouterType, MWMCircularProgress *> m_progresses;
}
- (void)awakeFromNib
{
@ -51,7 +52,26 @@ static CGFloat const kAdditionalHeight = 20.;
self.layer.rasterizationScale = UIScreen.mainScreen.scale;
[self.collectionView registerNib:[UINib nibWithNibName:[MWMRoutePointCell className] bundle:nil]
forCellWithReuseIdentifier:[MWMRoutePointCell className]];
[self setupProgresses];
}
- (void)setupProgresses
{
[self addProgress:self.vehicle imageName:@"ic_drive" routerType:routing::RouterType::Vehicle];
[self addProgress:self.pedestrian imageName:@"ic_walk" routerType:routing::RouterType::Pedestrian];
[self addProgress:self.bicycle imageName:@"ic_bike_route" routerType:routing::RouterType::Bicycle];
}
- (void)addProgress:(UIView *)parentView imageName:(NSString *)imageName routerType:(routing::RouterType)routerType
{
MWMCircularProgress * progress = [[MWMCircularProgress alloc] initWithParentView:parentView];
[progress
setImage:[UIImage imageNamed:imageName]
forStates:{MWMCircularProgressStateNormal, MWMCircularProgressStateFailed,
MWMCircularProgressStateSelected, MWMCircularProgressStateProgress,
MWMCircularProgressStateSpinner, MWMCircularProgressStateCompleted}];
progress.delegate = self;
m_progresses[routerType] = progress;
}
- (void)didMoveToSuperview
@ -87,8 +107,8 @@ static CGFloat const kAdditionalHeight = 20.;
- (void)statePrepare
{
self.pedestrianProgress.state = MWMCircularProgressStateNormal;
self.vehicleProgress.state = MWMCircularProgressStateNormal;
for (auto const & progress : m_progresses)
progress.second.state = MWMCircularProgressStateNormal;
self.arrowImageView.transform = CGAffineTransformMakeRotation(M_PI);
self.goButton.hidden = NO;
self.goButton.enabled = NO;
@ -178,28 +198,11 @@ static CGFloat const kAdditionalHeight = 20.;
[self.collectionView reloadData];
}
- (void)deselectPedestrian
- (void)selectRouter:(routing::RouterType)routerType
{
self.pedestrianProgress.state = MWMCircularProgressStateNormal;
}
- (void)selectProgress:(MWMCircularProgress *)progress;
{
if ([progress isEqual:self.pedestrianProgress])
{
self.vehicleProgress.state = MWMCircularProgressStateNormal;
self.pedestrianProgress.state = MWMCircularProgressStateSelected;
}
else
{
self.pedestrianProgress.state = MWMCircularProgressStateNormal;
self.vehicleProgress.state = MWMCircularProgressStateSelected;
}
}
- (void)deselectVehicle
{
self.vehicleProgress.state = MWMCircularProgressStateNormal;
for (auto const & progress : m_progresses)
progress.second.state = MWMCircularProgressStateNormal;
m_progresses[routerType].state = MWMCircularProgressStateSelected;
}
- (void)layoutSubviews
@ -211,6 +214,54 @@ static CGFloat const kAdditionalHeight = 20.;
[super layoutSubviews];
}
- (void)router:(routing::RouterType)routerType setState:(MWMCircularProgressState)state
{
m_progresses[routerType].state = state;
}
- (void)router:(routing::RouterType)routerType setProgress:(CGFloat)progress
{
m_progresses[routerType].progress = progress;
}
#pragma mark - MWMCircularProgressProtocol
- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress
{
[Statistics logEvent:kStatEventName(kStatNavigationDashboard, kStatButton)
withParameters:@{kStatValue : kStatProgress}];
MWMCircularProgressState const s = progress.state;
if (s == MWMCircularProgressStateSelected || s == MWMCircularProgressStateCompleted)
return;
for (auto const & prg : m_progresses)
{
if (prg.second != progress)
continue;
routing::RouterType const router = prg.first;
[self.dashboardManager setActiveRouter:router];
[self selectRouter:router];
switch (router)
{
case routing::RouterType::Vehicle:
[Statistics
logEvent:kStatPointToPoint
withParameters:@{kStatAction : kStatChangeRoutingMode, kStatValue : kStatVehicle}];
break;
case routing::RouterType::Pedestrian:
[Statistics
logEvent:kStatPointToPoint
withParameters:@{kStatAction : kStatChangeRoutingMode, kStatValue : kStatPedestrian}];
break;
case routing::RouterType::Bicycle:
[Statistics
logEvent:kStatPointToPoint
withParameters:@{kStatAction : kStatChangeRoutingMode, kStatValue : kStatBicycle}];
break;
}
}
}
#pragma mark - Properties
- (CGRect)defaultFrame
@ -375,38 +426,6 @@ static CGFloat const kAdditionalHeight = 20.;
}
}
#pragma mark - Properties
- (MWMCircularProgress *)pedestrianProgress
{
if (!_pedestrianProgress)
{
_pedestrianProgress = [[MWMCircularProgress alloc] initWithParentView:self.pedestrian];
[_pedestrianProgress
setImage:[UIImage imageNamed:@"ic_walk"]
forStates:{MWMCircularProgressStateNormal, MWMCircularProgressStateFailed,
MWMCircularProgressStateSelected, MWMCircularProgressStateProgress,
MWMCircularProgressStateSpinner, MWMCircularProgressStateCompleted}];
_pedestrianProgress.delegate = self.dashboardManager;
}
return _pedestrianProgress;
}
- (MWMCircularProgress *)vehicleProgress
{
if (!_vehicleProgress)
{
_vehicleProgress = [[MWMCircularProgress alloc] initWithParentView:self.vehicle];
[_vehicleProgress
setImage:[UIImage imageNamed:@"ic_drive"]
forStates:{MWMCircularProgressStateNormal, MWMCircularProgressStateFailed,
MWMCircularProgressStateSelected, MWMCircularProgressStateProgress,
MWMCircularProgressStateSpinner, MWMCircularProgressStateCompleted}];
_vehicleProgress.delegate = self.dashboardManager;
}
return _vehicleProgress;
}
@end
#pragma mark - UICollectionView

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15A284" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<customFonts key="customFonts">
<mutableArray key="HelveticaNeue.ttc">
@ -117,10 +117,10 @@
<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="104" y="14" width="204" height="20"/>
<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="204" height="20"/>
<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"/>
@ -141,10 +141,10 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Fm-p4-iHv" userLabel="Error box">
<rect key="frame" x="104" y="14" width="204" height="20"/>
<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="204" height="20"/>
<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"/>
@ -165,10 +165,10 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tjE-md-mqu" userLabel="Result box">
<rect key="frame" x="104" y="14" width="204" height="20"/>
<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="204" height="20"/>
<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"/>
@ -188,21 +188,44 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oQc-l8-sZH" userLabel="Buttons Box">
<rect key="frame" x="8" y="0.0" width="96" height="48"/>
<rect key="frame" x="8" y="0.0" width="134" height="48"/>
<subviews>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cZF-Ha-2tB">
<rect key="frame" x="6" y="6" width="38" height="38"/>
<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" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6D3-QF-6wm">
<rect key="frame" x="48" y="6" width="38" height="38"/>
<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 firstAttribute="width" constant="96" id="3TM-BU-wVs"/>
<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>
@ -252,6 +275,7 @@
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<connections>
<outlet property="arrowImageView" destination="y8P-JL-riK" id="rzP-ce-6f0"/>
<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"/>
@ -270,6 +294,6 @@
</objects>
<resources>
<image name="ic_arrow_up_and_down" width="9" height="9"/>
<image name="ic_nav_bar_back" width="44" height="44"/>
<image name="ic_nav_bar_back" width="14" height="22"/>
</resources>
</document>

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="10116" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
@ -87,21 +87,44 @@
<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="100" y="0.0" width="120" height="48"/>
<rect key="frame" x="70" y="0.0" width="180" height="48"/>
<subviews>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jDl-pu-eov">
<rect key="frame" x="6" y="6" width="36" height="36"/>
<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" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VhE-hA-Leo">
<rect key="frame" x="72" y="6" width="36" height="36"/>
<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 firstAttribute="width" constant="120" id="L2G-Qu-tAj"/>
<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>
@ -199,7 +222,7 @@
</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"/>
<rect key="frame" x="-16" y="-226" width="93" 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"/>
@ -209,7 +232,7 @@
</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"/>
<rect key="frame" x="-16" y="-226" width="28" height="28"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="coloring" value="MWMBlue"/>
</userDefinedRuntimeAttributes>
@ -251,7 +274,7 @@
<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"/>
<rect key="frame" x="0.0" y="-607" width="56" height="22"/>
<accessibility key="accessibilityConfiguration" identifier="goButton"/>
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
<state key="normal" title="Start"/>
@ -322,6 +345,7 @@
</userDefinedRuntimeAttributes>
<connections>
<outlet property="arriveLabel" destination="oec-Ee-6ha" id="7Ep-ck-NSQ"/>
<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"/>
@ -336,7 +360,7 @@
<outlet property="statusBoxHeight" destination="4qT-ha-p75" id="Ias-po-Adc"/>
<outlet property="vehicle" destination="jDl-pu-eov" id="awM-KI-2xO"/>
</connections>
<point key="canvasLocation" x="448" y="574.5"/>
<point key="canvasLocation" x="448" y="574"/>
</view>
</objects>
<resources>

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_bike_route.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_bike_route@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_bike_route@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -17,6 +17,7 @@ static NSString * const kStatAutoDownload = @"Auto download";
static NSString * const kStatBack = @"Back";
static NSString * const kStatBannerDescription = @"Banner description";
static NSString * const kStatBannerTitle = @"Banner title";
static NSString * const kStatBicycle = @"Bicycle";
static NSString * const kStatBookmarks = @"Bookmarks";
static NSString * const kStatBuildRoute = @"Build route";
static NSString * const kStatButton = @"Button";