From 51f5b31e1e0ab19b458d9b79ecb9d9c7605bdf00 Mon Sep 17 00:00:00 2001 From: Ilya Grechuhin Date: Tue, 17 May 2016 13:55:43 +0300 Subject: [PATCH] [ios] Extracted location button from menu to map. --- .../BottomMenu/MWMBottomMenuViewController.h | 2 - .../BottomMenu/MWMBottomMenuViewController.mm | 81 ------ .../MWMMapViewControlsManager.h | 3 +- .../MWMMapViewControlsManager.mm | 27 +- .../SideButtons/MWMSideButtons.h | 17 ++ .../SideButtons/MWMSideButtons.mm | 235 ++++++++++++++++++ .../SideButtons/MWMSideButtonsView.h | 11 + .../SideButtons/MWMSideButtonsView.mm | 145 +++++++++++ .../ZoomButtons/MWMZoomButtons.h | 0 .../ZoomButtons/MWMZoomButtons.mm | 0 .../ZoomButtons/MWMZoomButtonsView.h | 0 .../ZoomButtons/MWMZoomButtonsView.mm | 0 .../Views/RoutePreview/MWMRoutePreview.mm | 3 +- iphone/Maps/Classes/MapViewController.mm | 2 +- iphone/Maps/Classes/Storage/MWMStorage.h | 1 - iphone/Maps/Maps.xcodeproj/project.pbxproj | 60 ++--- 16 files changed, 460 insertions(+), 127 deletions(-) create mode 100644 iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.h create mode 100644 iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.mm create mode 100644 iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.h create mode 100644 iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.mm rename iphone/Maps/Classes/CustomViews/MapViewControls/{ => SideButtons}/ZoomButtons/MWMZoomButtons.h (100%) rename iphone/Maps/Classes/CustomViews/MapViewControls/{ => SideButtons}/ZoomButtons/MWMZoomButtons.mm (100%) rename iphone/Maps/Classes/CustomViews/MapViewControls/{ => SideButtons}/ZoomButtons/MWMZoomButtonsView.h (100%) rename iphone/Maps/Classes/CustomViews/MapViewControls/{ => SideButtons}/ZoomButtons/MWMZoomButtonsView.mm (100%) diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h index b7cda5a317..8198fb3156 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h @@ -30,6 +30,4 @@ - (void)mwm_refreshUI; - (void)refreshLayout; -- (void)processMyPositionStateModeEvent:(location::EMyPositionMode)mode; - @end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm index 2ad3c43d8c..9739797a2e 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm @@ -48,7 +48,6 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) @property (weak, nonatomic) MapViewController * controller; @property (weak, nonatomic) IBOutlet UICollectionView * buttonsCollectionView; -@property (weak, nonatomic) IBOutlet MWMButton * locationButton; @property (weak, nonatomic) IBOutlet UICollectionView * additionalButtons; @property (weak, nonatomic) IBOutlet UILabel * streetLabel; @@ -168,86 +167,6 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) self.state = MWMBottomMenuStateGo; } -- (void)processMyPositionStateModeEvent:(location::EMyPositionMode)mode -{ - UIButton * locBtn = self.locationButton; - [locBtn.imageView stopAnimating]; - [locBtn.imageView.layer removeAllAnimations]; - switch (mode) - { - case location::NotFollow: - case location::NotFollowNoPosition: - case location::Follow: - break; - case location::PendingPosition: - { - [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_pending"] - forState:UIControlStateNormal]; - CABasicAnimation * rotation; - rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; - rotation.duration = kDefaultAnimationDuration; - rotation.toValue = @(M_PI * 2.0 * rotation.duration); - rotation.cumulative = YES; - rotation.repeatCount = MAXFLOAT; - [locBtn.imageView.layer addAnimation:rotation forKey:@"locationImage"]; - break; - } - case location::FollowAndRotate: - { - NSUInteger const morphImagesCount = 6; - NSUInteger const endValue = morphImagesCount + 1; - NSMutableArray * morphImages = [NSMutableArray arrayWithCapacity:morphImagesCount]; - for (NSUInteger i = 1, j = 0; i != endValue; i++, j++) - { - morphImages[j] = [UIImage imageNamed:[NSString stringWithFormat:@"ic_follow_mode_%@_%@", @(i).stringValue, - [UIColor isNightMode] ? @"dark" : @"light"]]; - } - locBtn.imageView.animationImages = morphImages; - locBtn.imageView.animationRepeatCount = 1; - locBtn.imageView.image = morphImages.lastObject; - [locBtn.imageView startAnimating]; - break; - } - } - [self refreshLocationButtonState:mode]; -} - -#pragma mark - Location button - -- (void)refreshLocationButtonState:(location::EMyPositionMode)state -{ - dispatch_async(dispatch_get_main_queue(), ^ - { - if (self.locationButton.imageView.isAnimating) - { - [self refreshLocationButtonState:state]; - } - else - { - MWMButton * locBtn = self.locationButton; - switch (state) - { - case location::PendingPosition: - locBtn.coloring = MWMButtonColoringBlue; - break; - case location::NotFollow: - case location::NotFollowNoPosition: - [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_get_position"] forState:UIControlStateNormal]; - locBtn.coloring = MWMButtonColoringBlack; - break; - case location::Follow: - [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_follow"] forState:UIControlStateNormal]; - locBtn.coloring = MWMButtonColoringBlue; - break; - case location::FollowAndRotate: - [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_follow_and_rotate"] forState:UIControlStateNormal]; - locBtn.coloring = MWMButtonColoringBlue; - break; - } - } - }); -} - #pragma mark - Notifications - (void)searchStateWillChange:(NSNotification *)notification diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h index b3e3832bf1..ee962d55a8 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h @@ -15,7 +15,6 @@ @property (nonatomic) MWMBottomMenuState menuState; @property (nonatomic, readonly) MWMNavigationDashboardState navigationState; @property (nonatomic, readonly) MWMPlacePageEntity * placePageEntity; -@property (nonatomic, readonly) MWMBottomMenuViewController * menuController; @property (nonatomic) BOOL searchHidden; - (instancetype)init __attribute__((unavailable("init is not available"))); @@ -49,4 +48,6 @@ - (void)handleRoutingError; - (void)buildRoute; +- (void)processMyPositionStateModeEvent:(location::EMyPositionMode)mode; + @end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm index 056eceac2f..f16f5dddea 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm @@ -8,17 +8,17 @@ #import "MWMAuthorizationCommon.h" #import "MWMBottomMenuViewController.h" #import "MWMButton.h" -#import "MWMObjectsCategorySelectorController.h" #import "MWMFrameworkListener.h" #import "MWMFrameworkObservers.h" #import "MWMMapViewControlsManager.h" +#import "MWMObjectsCategorySelectorController.h" #import "MWMPlacePageEntity.h" #import "MWMPlacePageViewManager.h" #import "MWMPlacePageViewManagerDelegate.h" #import "MWMRoutePreview.h" #import "MWMSearchManager.h" #import "MWMSearchView.h" -#import "MWMZoomButtons.h" +#import "MWMSideButtons.h" #import "RouteState.h" #import "Statistics.h" @@ -42,7 +42,7 @@ extern NSString * const kAlohalyticsTapEventKey; MWMSearchManagerProtocol, MWMSearchViewProtocol, MWMBottomMenuControllerProtocol, MWMRoutePreviewDataSource, MWMFrameworkRouteBuilderObserver> -@property (nonatomic) MWMZoomButtons * zoomButtons; +@property (nonatomic) MWMSideButtons * sideButtons; @property (nonatomic) MWMBottomMenuViewController * menuController; @property (nonatomic) MWMPlacePageViewManager * placePageManager; @property (nonatomic) MWMNavigationDashboardManager * navigationManager; @@ -69,7 +69,7 @@ extern NSString * const kAlohalyticsTapEventKey; if (!self) return nil; self.ownerController = controller; - self.zoomButtons = [[MWMZoomButtons alloc] initWithParentView:controller.view]; + self.sideButtons = [[MWMSideButtons alloc] initWithParentView:controller.view]; self.menuController = [[MWMBottomMenuViewController alloc] initWithParentController:controller delegate:self]; self.placePageManager = [[MWMPlacePageViewManager alloc] initWithViewController:controller delegate:self]; self.navigationManager = [[MWMNavigationDashboardManager alloc] initWithParentView:controller.view delegate:self]; @@ -97,6 +97,13 @@ extern NSString * const kAlohalyticsTapEventKey; self.routeDestination = MWMRoutePoint::MWMRoutePointZero(); } +#pragma mark - My Position + +- (void)processMyPositionStateModeEvent:(location::EMyPositionMode)mode +{ + [self.sideButtons processMyPositionStateModeEvent:mode]; +} + #pragma mark - MWMFrameworkRouteBuilderObserver - (void)processRouteBuilderEvent:(routing::IRouter::ResultCode)code @@ -133,7 +140,7 @@ extern NSString * const kAlohalyticsTapEventKey; - (void)mwm_refreshUI { - [self.zoomButtons mwm_refreshUI]; + [self.sideButtons mwm_refreshUI]; [self.navigationManager mwm_refreshUI]; [self.searchManager mwm_refreshUI]; [self.menuController mwm_refreshUI]; @@ -340,7 +347,7 @@ extern NSString * const kAlohalyticsTapEventKey; if (ownerViewSize.width > ownerViewSize.height) self.menuController.leftBound = frame.origin.x + frame.size.width; else - [self.zoomButtons setBottomBound:frame.origin.y]; + [self.sideButtons setBottomBound:frame.origin.y]; } - (void)placePageDidClose @@ -444,7 +451,7 @@ extern NSString * const kAlohalyticsTapEventKey; if (!IPAD) { CGFloat const bound = newFrame.origin.y + newFrame.size.height; - self.placePageManager.topBound = self.zoomButtons.topBound = bound; + self.placePageManager.topBound = self.sideButtons.topBound = bound; return; } @@ -533,7 +540,7 @@ extern NSString * const kAlohalyticsTapEventKey; { CGFloat const topBound = self.topBound + self.navigationManager.height; if (!IPAD) - [self.zoomButtons setTopBound:topBound]; + [self.sideButtons setTopBound:topBound]; [self.placePageManager setTopBound:topBound]; } @@ -701,7 +708,7 @@ extern NSString * const kAlohalyticsTapEventKey; - (void)setZoomHidden:(BOOL)zoomHidden { _zoomHidden = zoomHidden; - self.zoomButtons.hidden = self.hidden || zoomHidden; + self.sideButtons.hidden = self.hidden || zoomHidden; } - (void)setMenuState:(MWMBottomMenuState)menuState @@ -752,7 +759,7 @@ extern NSString * const kAlohalyticsTapEventKey; { if (IPAD) return; - _topBound = self.placePageManager.topBound = self.zoomButtons.topBound = self.navigationManager.topBound = topBound; + _topBound = self.placePageManager.topBound = self.sideButtons.topBound = self.navigationManager.topBound = topBound; } - (void)setLeftBound:(CGFloat)leftBound diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.h b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.h new file mode 100644 index 0000000000..a91ef52126 --- /dev/null +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.h @@ -0,0 +1,17 @@ +#include "platform/location.hpp" + +@class MWMSideButtonsView; + +@interface MWMSideButtons : NSObject + +@property (nonatomic) BOOL hidden; + +- (instancetype)init __attribute__((unavailable("init is not available"))); +- (instancetype)initWithParentView:(UIView *)view; +- (void)setTopBound:(CGFloat)bound; +- (void)setBottomBound:(CGFloat)bound; +- (void)mwm_refreshUI; + +- (void)processMyPositionStateModeEvent:(location::EMyPositionMode)mode; + +@end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.mm new file mode 100644 index 0000000000..433a7e2aa7 --- /dev/null +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtons.mm @@ -0,0 +1,235 @@ +#import "Common.h" +#import "MWMButton.h" +#import "MWMSideButtons.h" +#import "MWMSideButtonsView.h" +#import "Statistics.h" +#import "UIColor+MapsMeColor.h" + +#import "3party/Alohalytics/src/alohalytics_objc.h" + +#include "Framework.h" +#include "platform/settings.hpp" +#include "indexer/scales.hpp" + +static NSString * const kMWMSideButtonsViewNibName = @"MWMSideButtonsView"; + +extern NSString * const kAlohalyticsTapEventKey; + +namespace +{ + NSArray * animationImages(NSString * animationTemplate, NSUInteger imagesCount) + { + NSMutableArray * images = [NSMutableArray arrayWithCapacity:imagesCount]; + NSString * mode = [UIColor isNightMode] ? @"dark" : @"light"; + for (NSUInteger i = 1; i <= imagesCount; i += 1) + { + NSString * name = [NSString stringWithFormat:@"%@_%@_%@", animationTemplate, mode, @(i).stringValue]; + [images addObject:[UIImage imageNamed:name]]; + } + return images.copy; + } +} // namespace + +@interface MWMSideButtons() + +@property (nonatomic) IBOutlet MWMSideButtonsView * sideView; +@property (weak, nonatomic) IBOutlet MWMButton * zoomInButton; +@property (weak, nonatomic) IBOutlet MWMButton * zoomOutButton; +@property (weak, nonatomic) IBOutlet MWMButton * locationButton; + +@property (nonatomic) BOOL zoomSwipeEnabled; +@property (nonatomic, readonly) BOOL isZoomEnabled; + +@property (nonatomic) location::EMyPositionMode locationMode; + +@end + +@implementation MWMSideButtons + +- (instancetype)initWithParentView:(UIView *)view +{ + self = [super init]; + if (self) + { + [[NSBundle mainBundle] loadNibNamed:kMWMSideButtonsViewNibName owner:self options:nil]; + [view addSubview:self.sideView]; + [self.sideView layoutIfNeeded]; + self.sideView.topBound = 0.0; + self.sideView.bottomBound = view.height; + self.zoomSwipeEnabled = NO; + } + return self; +} + +- (void)setTopBound:(CGFloat)bound +{ + self.sideView.topBound = bound; +} + +- (void)setBottomBound:(CGFloat)bound +{ + self.sideView.bottomBound = bound; +} + +- (void)zoomIn +{ + [Statistics logEvent:kStatEventName(kStatZoom, kStatIn)]; + [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"+"]; + GetFramework().Scale(Framework::SCALE_MAG, true); +} + +- (void)zoomOut +{ + [Statistics logEvent:kStatEventName(kStatZoom, kStatOut)]; + [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"-"]; + GetFramework().Scale(Framework::SCALE_MIN, true); +} + +- (void)mwm_refreshUI +{ + [self.sideView mwm_refreshUI]; +} + +- (void)processMyPositionStateModeEvent:(location::EMyPositionMode)mode +{ + UIButton * locBtn = self.locationButton; + [locBtn.imageView stopAnimating]; + NSArray * images = nil; + switch (mode) + { + case location::NotFollow: + case location::NotFollowNoPosition: + { + if (self.locationMode == location::FollowAndRotate) + images = animationImages(@"btn_follow_and_rotate_to_get_position", 3); + else if (self.locationMode == location::Follow) + images = animationImages(@"btn_follow_to_get_position", 3); + break; + } + case location::Follow: + { + if (self.locationMode == location::FollowAndRotate) + images = animationImages(@"btn_follow_and_rotate_to_follow", 3); + else if (self.locationMode == location::NotFollow || self.locationMode == location::NotFollowNoPosition) + images = animationImages(@"btn_get_position_to_follow", 3); + break; + } + case location::PendingPosition: + break; + case location::FollowAndRotate: + { + if (self.locationMode == location::Follow) + images = animationImages(@"btn_follow_to_follow_and_rotate", 3); + break; + } + } + locBtn.imageView.animationDuration = 0.0; + locBtn.imageView.animationImages = images; + locBtn.imageView.animationRepeatCount = 1; + locBtn.imageView.image = images.lastObject; + [locBtn.imageView startAnimating]; + [self refreshLocationButtonState:mode]; + self.locationMode = mode; +} + +#pragma mark - Location button + +- (void)refreshLocationButtonState:(location::EMyPositionMode)state +{ + dispatch_async(dispatch_get_main_queue(), ^ + { + if (self.locationButton.imageView.isAnimating) + { + [self refreshLocationButtonState:state]; + } + else + { + MWMButton * locBtn = self.locationButton; + switch (state) + { + case location::PendingPosition: + { + NSArray * images = animationImages(@"btn_pending", 12); + locBtn.imageView.animationDuration = 0.8; + locBtn.imageView.animationImages = images; + locBtn.imageView.animationRepeatCount = 0; + locBtn.imageView.image = images.lastObject; + [locBtn.imageView startAnimating]; + break; + } + case location::NotFollow: + case location::NotFollowNoPosition: + locBtn.imageName = @"btn_get_position"; + break; + case location::Follow: + locBtn.imageName = @"btn_follow"; + break; + case location::FollowAndRotate: + locBtn.imageName = @"btn_follow_and_rotate"; + break; + } + } + }); +} + +#pragma mark - Actions + +- (IBAction)zoomTouchDown:(UIButton *)sender +{ + self.zoomSwipeEnabled = YES; +} + +- (IBAction)zoomTouchUpInside:(UIButton *)sender +{ + self.zoomSwipeEnabled = NO; + if ([sender isEqual:self.zoomInButton]) + [self zoomIn]; + else + [self zoomOut]; +} + +- (IBAction)zoomTouchUpOutside:(UIButton *)sender +{ + self.zoomSwipeEnabled = NO; +} + +- (IBAction)zoomSwipe:(UIPanGestureRecognizer *)sender +{ + if (!self.zoomSwipeEnabled) + return; + UIView * const superview = self.sideView.superview; + CGFloat const translation = -[sender translationInView:superview].y / superview.bounds.size.height; + + CGFloat const scaleFactor = exp(translation); + GetFramework().Scale(scaleFactor, false); +} + +- (IBAction)locationTouchUpInside +{ + [Statistics logEvent:kStatMenu withParameters:@{kStatButton : kStatLocation}]; + GetFramework().SwitchMyPositionNextMode(); +} + +#pragma mark - Properties + +- (BOOL)isZoomEnabled +{ + bool zoomButtonsEnabled = true; + (void)settings::Get("ZoomButtonsEnabled", zoomButtonsEnabled); + return zoomButtonsEnabled; +} + +- (BOOL)hidden +{ + return self.isZoomEnabled ? self.sideView.hidden : YES; +} + +- (void)setHidden:(BOOL)hidden +{ + if (self.isZoomEnabled) + [self.sideView setHidden:hidden animated:YES]; + else + self.sideView.hidden = YES; +} + +@end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.h b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.h new file mode 100644 index 0000000000..9123d6c841 --- /dev/null +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.h @@ -0,0 +1,11 @@ +@interface MWMSideButtonsView : UIView + +@property (nonatomic) CGFloat topBound; +@property (nonatomic) CGFloat bottomBound; + +- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available"))); +- (instancetype)init __attribute__((unavailable("init is not available"))); + +- (void)setHidden:(BOOL)hidden animated:(BOOL)animated; + +@end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.mm new file mode 100644 index 0000000000..65bf984d7b --- /dev/null +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/MWMSideButtonsView.mm @@ -0,0 +1,145 @@ +#import "Common.h" +#import "MWMSideButtonsView.h" +#import "MWMMapViewControlsCommon.h" + +static CGFloat const kZoomViewOffsetToTopBound = 12.0; +static CGFloat const kZoomViewOffsetToBottomBound = 40.0; +static CGFloat const kZoomViewOffsetToFrameBound = 294.0; +static CGFloat const kZoomViewHideBoundPercent = 0.4; + +@interface MWMSideButtonsView() + +@property (nonatomic) CGRect defaultBounds; +@property (nonatomic) BOOL show; + +@end + +@implementation MWMSideButtonsView + +- (void)awakeFromNib +{ + self.defaultBounds = self.bounds; + self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; +} + +- (void)layoutSubviews +{ + self.bounds = self.defaultBounds; + [self layoutXPosition:self.hidden]; + [self layoutYPosition]; + [super layoutSubviews]; +} + +- (void)layoutXPosition:(BOOL)hidden +{ + if (hidden) + self.minX = self.superview.width; + else + self.maxX = self.superview.width - kViewControlsOffsetToBounds; +} + +- (void)layoutYPosition +{ + CGFloat const maxY = MIN(self.superview.height - kZoomViewOffsetToFrameBound, self.bottomBound - kZoomViewOffsetToBottomBound); + self.minY = MAX(maxY - self.height, self.topBound + kZoomViewOffsetToTopBound); +} + +- (void)moveAnimated +{ + if (self.hidden) + return; + [UIView animateWithDuration:framesDuration(kMenuViewMoveFramesCount) animations:^{ [self layoutYPosition]; }]; +} + +- (void)fadeAnimated +{ + [UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^{ self.alpha = self.show ? 1.0 : 0.0; }]; +} + +- (void)animate +{ + CGFloat const hideBound = kZoomViewHideBoundPercent * self.superview.height; + BOOL const isHidden = self.alpha == 0.0; + BOOL const willHide = (self.bottomBound < hideBound) || (self.defaultBounds.size.height > self.bottomBound - self.topBound); + if (willHide) + { + if (!isHidden) + self.show = NO; + } + else + { + [self moveAnimated]; + if (isHidden) + self.show = YES; + } +} + +#pragma mark - Properties + +- (void)setHidden:(BOOL)hidden animated:(BOOL)animated +{ + if (animated) + { + if (self.hidden == hidden) + return; + if (!hidden) + self.hidden = NO; + [self layoutXPosition:!hidden]; + [UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^ + { + [self layoutXPosition:hidden]; + } + completion:^(BOOL finished) + { + if (hidden) + self.hidden = YES; + }]; + } + else + { + self.hidden = hidden; + } +} + +@synthesize topBound = _topBound; + +- (void)setTopBound:(CGFloat)topBound +{ + if (equalScreenDimensions(_topBound, topBound)) + return; + _topBound = topBound; + [self animate]; +} + +- (CGFloat)topBound +{ + return MAX(0.0, _topBound); +} + +@synthesize bottomBound = _bottomBound; + +- (void)setBottomBound:(CGFloat)bottomBound +{ + if (equalScreenDimensions(_bottomBound, bottomBound)) + return; + _bottomBound = bottomBound; + [self animate]; +} + +- (CGFloat)bottomBound +{ + if (!self.superview) + return _bottomBound; + BOOL const isPortrait = self.superview.width < self.superview.height; + CGFloat limit = IPAD ? 320.0 : isPortrait ? 150.0 : 80.0; + return MIN(self.superview.height - limit, _bottomBound); +} + +- (void)setShow:(BOOL)show +{ + _show = show; + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [self performSelector:@selector(fadeAnimated) withObject:self afterDelay:show ? 0.0 : framesDuration(kMenuViewMoveFramesCount)]; +} + +@end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.h b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtons.h similarity index 100% rename from iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.h rename to iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtons.h diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtons.mm similarity index 100% rename from iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.mm rename to iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtons.mm diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtonsView.h b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtonsView.h similarity index 100% rename from iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtonsView.h rename to iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtonsView.h diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtonsView.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtonsView.mm similarity index 100% rename from iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtonsView.mm rename to iphone/Maps/Classes/CustomViews/MapViewControls/SideButtons/ZoomButtons/MWMZoomButtonsView.mm diff --git a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm index d3f5ffeb22..fb9595a85e 100644 --- a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm +++ b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm @@ -204,10 +204,11 @@ static CGFloat const kAdditionalHeight = 20.; - (void)layoutSubviews { - [self setupActualHeight]; [super layoutSubviews]; + [self setupActualHeight]; if (IPAD) [self.delegate routePreviewDidChangeFrame:self.frame]; + [super layoutSubviews]; } #pragma mark - Properties diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index f9a90c7efd..301b06ee77 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -520,7 +520,7 @@ BOOL gIsFirstMyPositionMode = YES; // Probably it's better to subscribe only wnen needed and usubscribe in other cases. // May be better solution would be multiobservers support in the C++ core. [self processMyPositionStateModeEvent:mode]; - [self.controlsManager.menuController processMyPositionStateModeEvent:mode]; + [self.controlsManager processMyPositionStateModeEvent:mode]; [[MapsAppDelegate theApp].locationManager processMyPositionStateModeEvent:mode]; }); diff --git a/iphone/Maps/Classes/Storage/MWMStorage.h b/iphone/Maps/Classes/Storage/MWMStorage.h index 84d0f08a27..2545e74be6 100644 --- a/iphone/Maps/Classes/Storage/MWMStorage.h +++ b/iphone/Maps/Classes/Storage/MWMStorage.h @@ -4,7 +4,6 @@ @interface MWMStorage : NSObject -+ (void)startSession; + (void)downloadNode:(storage::TCountryId const &)countryId alertController:(MWMAlertViewController *)alertController onSuccess:(TMWMVoidBlock)onSuccess; + (void)retryDownloadNode:(storage::TCountryId const &)countryId; + (void)updateNode:(storage::TCountryId const &)countryId alertController:(MWMAlertViewController *)alertController; diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index ccb460d8bc..b2bea46c0f 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -157,6 +157,12 @@ 347FDDA11BB59B4E00871410 /* Mapsme.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 347FDDA01BB59B4E00871410 /* Mapsme.storyboard */; }; 3485C0121B85C20E00F7712D /* MWMSearchTableViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3485C0101B85C20E00F7712D /* MWMSearchTableViewController.mm */; }; 3485C0131B85C20E00F7712D /* MWMSearchTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3485C0111B85C20E00F7712D /* MWMSearchTableViewController.xib */; }; + 3490D2DE1CE9DD2500D0B838 /* MWMSideButtons.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3490D2DA1CE9DD2500D0B838 /* MWMSideButtons.mm */; }; + 3490D2DF1CE9DD2500D0B838 /* MWMSideButtons.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3490D2DA1CE9DD2500D0B838 /* MWMSideButtons.mm */; }; + 3490D2E01CE9DD2500D0B838 /* MWMSideButtonsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3490D2DC1CE9DD2500D0B838 /* MWMSideButtonsView.mm */; }; + 3490D2E11CE9DD2500D0B838 /* MWMSideButtonsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3490D2DC1CE9DD2500D0B838 /* MWMSideButtonsView.mm */; }; + 3490D2E21CE9DD2500D0B838 /* MWMSideButtonsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3490D2DD1CE9DD2500D0B838 /* MWMSideButtonsView.xib */; }; + 3490D2E31CE9DD2500D0B838 /* MWMSideButtonsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3490D2DD1CE9DD2500D0B838 /* MWMSideButtonsView.xib */; }; 3491E7CB1C06F1F10042FE24 /* MWMPlacePageButtonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3491E7C91C06F1F10042FE24 /* MWMPlacePageButtonCell.mm */; }; 3491E7CC1C06F1F10042FE24 /* MWMPlacePageButtonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3491E7C91C06F1F10042FE24 /* MWMPlacePageButtonCell.mm */; }; 3491E7CD1C06F1F10042FE24 /* MWMPlacePageButtonCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3491E7CA1C06F1F10042FE24 /* MWMPlacePageButtonCell.xib */; }; @@ -212,9 +218,6 @@ 34BC1E561C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC1E551C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm */; }; 34BC1E571C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC1E551C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm */; }; 34BC72241B0DECAE0012A34B /* MWMMapViewControlsManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC72111B0DECAE0012A34B /* MWMMapViewControlsManager.mm */; }; - 34BC72291B0DECAE0012A34B /* MWMZoomButtons.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC721D1B0DECAE0012A34B /* MWMZoomButtons.mm */; }; - 34BC722A1B0DECAE0012A34B /* MWMZoomButtonsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC721F1B0DECAE0012A34B /* MWMZoomButtonsView.mm */; }; - 34BC722B1B0DECAE0012A34B /* MWMZoomButtonsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34BC72201B0DECAE0012A34B /* MWMZoomButtonsView.xib */; }; 34BF0CC61C31304A00D097EB /* MWMAuthorizationCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BF0CC51C31304A00D097EB /* MWMAuthorizationCommon.mm */; }; 34BF0CC71C31304A00D097EB /* MWMAuthorizationCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BF0CC51C31304A00D097EB /* MWMAuthorizationCommon.mm */; }; 34C659471BD12A77009DC20A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 34C659451BD12A77009DC20A /* InfoPlist.strings */; }; @@ -337,7 +340,6 @@ 6741A9531BF340DE002C974C /* 01_dejavusans.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E5134C4968003A9827 /* 01_dejavusans.ttf */; }; 6741A9541BF340DE002C974C /* 02_droidsans-fallback.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9DF04B231B71010E00DACAF1 /* 02_droidsans-fallback.ttf */; }; 6741A9551BF340DE002C974C /* resources-xxhdpi_dark in Resources */ = {isa = PBXBuildFile; fileRef = 4A7D89C41B2EBF3B00AC843E /* resources-xxhdpi_dark */; }; - 6741A9561BF340DE002C974C /* MWMZoomButtonsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34BC72201B0DECAE0012A34B /* MWMZoomButtonsView.xib */; }; 6741A9571BF340DE002C974C /* 03_jomolhari-id-a3d.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E7134C4968003A9827 /* 03_jomolhari-id-a3d.ttf */; }; 6741A9581BF340DE002C974C /* 04_padauk.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E8134C4968003A9827 /* 04_padauk.ttf */; }; 6741A9591BF340DE002C974C /* 05_khmeros.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E9134C4968003A9827 /* 05_khmeros.ttf */; }; @@ -433,7 +435,6 @@ 6741A9C21BF340DE002C974C /* MWMiPhonePortraitPlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6F722F71AE1572400DA3DA1 /* MWMiPhonePortraitPlacePage.mm */; }; 6741A9C31BF340DE002C974C /* MWMPlacePageActionBar.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6CB21671AEFC6AA00FB8963 /* MWMPlacePageActionBar.mm */; }; 6741A9C41BF340DE002C974C /* MWMRouteHelperPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = F68E6BD11B8DB7AE0040566D /* MWMRouteHelperPanel.mm */; }; - 6741A9C51BF340DE002C974C /* MWMZoomButtons.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC721D1B0DECAE0012A34B /* MWMZoomButtons.mm */; }; 6741A9C61BF340DE002C974C /* MWMSearchCommonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34B82ADC1B84A4A000180497 /* MWMSearchCommonCell.mm */; }; 6741A9C81BF340DE002C974C /* MWMiPhoneLandscapePlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FA71B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm */; }; 6741A9C91BF340DE002C974C /* ToastView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 974386DC19373EA400FD5659 /* ToastView.mm */; }; @@ -497,7 +498,6 @@ 6741AA0F1BF340DE002C974C /* MWMSearchHistoryMyPositionCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6A750B81BE8C74400981B41 /* MWMSearchHistoryMyPositionCell.mm */; }; 6741AA101BF340DE002C974C /* SelectableCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 978F923A183B660F000D6C7C /* SelectableCell.mm */; }; 6741AA111BF340DE002C974C /* MWMSearchCategoriesManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34B82AE11B84AC5E00180497 /* MWMSearchCategoriesManager.mm */; }; - 6741AA121BF340DE002C974C /* MWMZoomButtonsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC721F1B0DECAE0012A34B /* MWMZoomButtonsView.mm */; }; 6741AA131BF340DE002C974C /* UIColor+MapsMeColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6F533A21B3C248900C1940B /* UIColor+MapsMeColor.mm */; }; 6741AA141BF340DE002C974C /* MWMMultilineLabel.mm in Sources */ = {isa = PBXBuildFile; fileRef = 346EDADA1B9F0E35004F8DB5 /* MWMMultilineLabel.mm */; }; 6741AA151BF340DE002C974C /* Statistics.mm in Sources */ = {isa = PBXBuildFile; fileRef = CB252D6C16FF82C8001E41E9 /* Statistics.mm */; }; @@ -1030,6 +1030,11 @@ 3485C0111B85C20E00F7712D /* MWMSearchTableViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMSearchTableViewController.xib; sourceTree = ""; }; 348D1DF91C525B8300860465 /* MWMTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMTypes.h; sourceTree = ""; }; 348E57981B0F49D8000FA02A /* maps.me dbg.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "maps.me dbg.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3490D2D91CE9DD2500D0B838 /* MWMSideButtons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSideButtons.h; sourceTree = ""; }; + 3490D2DA1CE9DD2500D0B838 /* MWMSideButtons.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSideButtons.mm; sourceTree = ""; }; + 3490D2DB1CE9DD2500D0B838 /* MWMSideButtonsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSideButtonsView.h; sourceTree = ""; }; + 3490D2DC1CE9DD2500D0B838 /* MWMSideButtonsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSideButtonsView.mm; sourceTree = ""; }; + 3490D2DD1CE9DD2500D0B838 /* MWMSideButtonsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMSideButtonsView.xib; sourceTree = ""; }; 3491E7C81C06F1F10042FE24 /* MWMPlacePageButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePageButtonCell.h; sourceTree = ""; }; 3491E7C91C06F1F10042FE24 /* MWMPlacePageButtonCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPlacePageButtonCell.mm; sourceTree = ""; }; 3491E7CA1C06F1F10042FE24 /* MWMPlacePageButtonCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMPlacePageButtonCell.xib; sourceTree = ""; }; @@ -1097,11 +1102,6 @@ 34BC1E551C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursCommon.mm; sourceTree = ""; }; 34BC72101B0DECAE0012A34B /* MWMMapViewControlsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapViewControlsManager.h; sourceTree = ""; }; 34BC72111B0DECAE0012A34B /* MWMMapViewControlsManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapViewControlsManager.mm; sourceTree = ""; }; - 34BC721C1B0DECAE0012A34B /* MWMZoomButtons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMZoomButtons.h; sourceTree = ""; }; - 34BC721D1B0DECAE0012A34B /* MWMZoomButtons.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MWMZoomButtons.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 34BC721E1B0DECAE0012A34B /* MWMZoomButtonsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMZoomButtonsView.h; sourceTree = ""; }; - 34BC721F1B0DECAE0012A34B /* MWMZoomButtonsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMZoomButtonsView.mm; sourceTree = ""; }; - 34BC72201B0DECAE0012A34B /* MWMZoomButtonsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMZoomButtonsView.xib; sourceTree = ""; }; 34BF0CC51C31304A00D097EB /* MWMAuthorizationCommon.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMAuthorizationCommon.mm; sourceTree = ""; }; 34BF0CC81C31306300D097EB /* MWMAuthorizationCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMAuthorizationCommon.h; sourceTree = ""; }; 34C659461BD12A77009DC20A /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -1990,6 +1990,18 @@ path = Framework; sourceTree = ""; }; + 345C34661CE9D32500BB2224 /* SideButtons */ = { + isa = PBXGroup; + children = ( + 3490D2D91CE9DD2500D0B838 /* MWMSideButtons.h */, + 3490D2DA1CE9DD2500D0B838 /* MWMSideButtons.mm */, + 3490D2DB1CE9DD2500D0B838 /* MWMSideButtonsView.h */, + 3490D2DC1CE9DD2500D0B838 /* MWMSideButtonsView.mm */, + 3490D2DD1CE9DD2500D0B838 /* MWMSideButtonsView.xib */, + ); + path = SideButtons; + sourceTree = ""; + }; 3465E7D51B66589900854C4D /* APIBar */ = { isa = PBXGroup; children = ( @@ -2243,7 +2255,7 @@ 34BC72101B0DECAE0012A34B /* MWMMapViewControlsManager.h */, 34BC72111B0DECAE0012A34B /* MWMMapViewControlsManager.mm */, 349C26AE1BB0116D0005DF2F /* BottomMenu */, - 34BC721B1B0DECAE0012A34B /* ZoomButtons */, + 345C34661CE9D32500BB2224 /* SideButtons */, 3497A9321B5CF8A900F51E55 /* NavigationDashboard */, F6F722F51AE156A000DA3DA1 /* PlacePage */, ); @@ -2251,18 +2263,6 @@ path = CustomViews/MapViewControls; sourceTree = ""; }; - 34BC721B1B0DECAE0012A34B /* ZoomButtons */ = { - isa = PBXGroup; - children = ( - 34BC721C1B0DECAE0012A34B /* MWMZoomButtons.h */, - 34BC721D1B0DECAE0012A34B /* MWMZoomButtons.mm */, - 34BC721E1B0DECAE0012A34B /* MWMZoomButtonsView.h */, - 34BC721F1B0DECAE0012A34B /* MWMZoomButtonsView.mm */, - 34BC72201B0DECAE0012A34B /* MWMZoomButtonsView.xib */, - ); - path = ZoomButtons; - sourceTree = ""; - }; 34CC4C051B81F38E00E44C1F /* TabbedView */ = { isa = PBXGroup; children = ( @@ -3268,7 +3268,6 @@ 4A7D89C81B2EBF3B00AC843E /* resources-xxhdpi_dark in Resources */, 9DA46A0C1C47E92100EF52BA /* resources-xhdpi_legacy in Resources */, 9DA46A0E1C47E92100EF52BA /* resources-xxhdpi_legacy in Resources */, - 34BC722B1B0DECAE0012A34B /* MWMZoomButtonsView.xib in Resources */, EEA61603134C496A003A9827 /* 03_jomolhari-id-a3d.ttf in Resources */, 347FD8711C60B2CE002FB65E /* MWMOpeningHoursAllDayTableViewCell.xib in Resources */, EEA61604134C496A003A9827 /* 04_padauk.ttf in Resources */, @@ -3322,6 +3321,7 @@ FA99CB73147089B100689A9A /* Localizable.strings in Resources */, 34CFFE8D1B7DE71C009D0C9F /* MWMSearchView.xib in Resources */, 3401CD711C3C0C420028C6F8 /* MWMEditorNameTableViewCell.xib in Resources */, + 3490D2E21CE9DD2500D0B838 /* MWMSideButtonsView.xib in Resources */, 347FD8751C60B2CE002FB65E /* MWMOpeningHoursClosedSpanTableViewCell.xib in Resources */, 6B9978351C89A316003B8AA0 /* editor.config in Resources */, F6588E381B15D87A00EE1E58 /* MWMBookmarkColorCell.xib in Resources */, @@ -3421,7 +3421,6 @@ 347FD86E1C60B2CE002FB65E /* MWMOpeningHoursAddScheduleTableViewCell.xib in Resources */, 9DA46A0D1C47E92100EF52BA /* resources-xhdpi_legacy in Resources */, 9DA46A0F1C47E92100EF52BA /* resources-xxhdpi_legacy in Resources */, - 6741A9561BF340DE002C974C /* MWMZoomButtonsView.xib in Resources */, 6741A9571BF340DE002C974C /* 03_jomolhari-id-a3d.ttf in Resources */, 6741A9581BF340DE002C974C /* 04_padauk.ttf in Resources */, 6741A9591BF340DE002C974C /* 05_khmeros.ttf in Resources */, @@ -3468,6 +3467,7 @@ 3401CD6A1C3C03A80028C6F8 /* MWMEditorTextTableViewCell.xib in Resources */, 341F99E01C6B1165001C67B8 /* MWMMapDownloaderSubplaceTableViewCell.xib in Resources */, 6741A9751BF340DE002C974C /* WorldCoasts.mwm in Resources */, + 3490D2E31CE9DD2500D0B838 /* MWMSideButtonsView.xib in Resources */, 6741A9761BF340DE002C974C /* packed_polygons.bin in Resources */, 6741A9771BF340DE002C974C /* MWMDirectionView.xib in Resources */, 6741A9781BF340DE002C974C /* AddSetTableViewCell.xib in Resources */, @@ -3573,6 +3573,7 @@ F64F199D1AB81A00006EAF7E /* MWMDefaultAlert.mm in Sources */, 3438CDF81B8616760051AA78 /* MWMSearchShowOnMapCell.mm in Sources */, 34F45E8E1B96E88100AC93F8 /* MWMSearchTabButtonsView.mm in Sources */, + 3490D2DE1CE9DD2500D0B838 /* MWMSideButtons.mm in Sources */, 342FDDE51C6C9071000038A0 /* MWMMapDownloaderDataSource.mm in Sources */, 347FD86B1C60B2CE002FB65E /* MWMOpeningHoursAddScheduleTableViewCell.mm in Sources */, 34CD81BB1C91C24D007D2A60 /* MWMWelcomeController.mm in Sources */, @@ -3608,7 +3609,6 @@ F68E6BD21B8DB7AE0040566D /* MWMRouteHelperPanel.mm in Sources */, 34E273251C73876500463965 /* MWMMigrationView.mm in Sources */, 347FD87B1C60B2CE002FB65E /* MWMOpeningHoursDeleteScheduleTableViewCell.mm in Sources */, - 34BC72291B0DECAE0012A34B /* MWMZoomButtons.mm in Sources */, 340C20E31C3E565600111D22 /* MWMCuisineEditorViewController.mm in Sources */, 34B82ADE1B84A4A000180497 /* MWMSearchCommonCell.mm in Sources */, F66A8FA81B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm in Sources */, @@ -3679,6 +3679,7 @@ F6DBF9B61AA8779300F2EC2C /* CALayer+RuntimeAttributes.mm in Sources */, 347FD8731C60B2CE002FB65E /* MWMOpeningHoursClosedSpanTableViewCell.mm in Sources */, FA36B80D15403A4F004560CC /* BookmarksVC.mm in Sources */, + 3490D2E01CE9DD2500D0B838 /* MWMSideButtonsView.mm in Sources */, F668F6561BCD4507002D6FFC /* MWMTTSSettingsViewController.mm in Sources */, 34ABA61B1C2D4DCC00FE1BEC /* UITextField+RuntimeAttributes.mm in Sources */, 34EC270A1CB2A7120084FA36 /* fabric_logging_ios.mm in Sources */, @@ -3729,7 +3730,6 @@ 978F9242183B660F000D6C7C /* SelectableCell.mm in Sources */, 34ABA6241C2D551900FE1BEC /* MWMInputValidatorFactory.mm in Sources */, 34B82AE21B84AC5E00180497 /* MWMSearchCategoriesManager.mm in Sources */, - 34BC722A1B0DECAE0012A34B /* MWMZoomButtonsView.mm in Sources */, 34CE8A671C7740E100F4351A /* MWMStorage.mm in Sources */, F6F533A31B3C248900C1940B /* UIColor+MapsMeColor.mm in Sources */, 346EDADB1B9F0E35004F8DB5 /* MWMMultilineLabel.mm in Sources */, @@ -3792,6 +3792,7 @@ 6741A9A91BF340DE002C974C /* MWMDefaultAlert.mm in Sources */, 6741A9AA1BF340DE002C974C /* MWMSearchShowOnMapCell.mm in Sources */, 6741A9AC1BF340DE002C974C /* MWMSearchTabButtonsView.mm in Sources */, + 3490D2DF1CE9DD2500D0B838 /* MWMSideButtons.mm in Sources */, 342FDDE61C6C9071000038A0 /* MWMMapDownloaderDataSource.mm in Sources */, 6741A9AD1BF340DE002C974C /* MWMSpringAnimation.mm in Sources */, 34CD81BC1C91C24D007D2A60 /* MWMWelcomeController.mm in Sources */, @@ -3821,7 +3822,6 @@ 347FD8841C60B2CE002FB65E /* MWMOpeningHoursTableViewCell.mm in Sources */, 6741A9C31BF340DE002C974C /* MWMPlacePageActionBar.mm in Sources */, 6741A9C41BF340DE002C974C /* MWMRouteHelperPanel.mm in Sources */, - 6741A9C51BF340DE002C974C /* MWMZoomButtons.mm in Sources */, 6741A9C61BF340DE002C974C /* MWMSearchCommonCell.mm in Sources */, 34E273261C73876500463965 /* MWMMigrationView.mm in Sources */, 340C20E41C3E565600111D22 /* MWMCuisineEditorViewController.mm in Sources */, @@ -3898,6 +3898,7 @@ 6741A9F71BF340DE002C974C /* MWMPedestrianShareAlert.mm in Sources */, 347FD8741C60B2CE002FB65E /* MWMOpeningHoursClosedSpanTableViewCell.mm in Sources */, 6741A9F81BF340DE002C974C /* MWMSharePedestrianRoutesToastActivityItem.mm in Sources */, + 3490D2E11CE9DD2500D0B838 /* MWMSideButtonsView.mm in Sources */, 6741A9F91BF340DE002C974C /* MWMSearchSuggestionCell.mm in Sources */, 34ABA61C1C2D4DCC00FE1BEC /* UITextField+RuntimeAttributes.mm in Sources */, 34EC270B1CB2A7120084FA36 /* fabric_logging_ios.mm in Sources */, @@ -3943,7 +3944,6 @@ 6741AA111BF340DE002C974C /* MWMSearchCategoriesManager.mm in Sources */, 34ABA6211C2D517500FE1BEC /* MWMInputValidator.mm in Sources */, 34CD81D11C92A884007D2A60 /* MWMPageControllerDataSource.mm in Sources */, - 6741AA121BF340DE002C974C /* MWMZoomButtonsView.mm in Sources */, 6741AA131BF340DE002C974C /* UIColor+MapsMeColor.mm in Sources */, 34ABA6251C2D551900FE1BEC /* MWMInputValidatorFactory.mm in Sources */, 34CE8A681C7740E100F4351A /* MWMStorage.mm in Sources */,