forked from organicmaps/organicmaps
[ios] New iPad place page
This commit is contained in:
parent
915d8130a7
commit
889e54a785
40 changed files with 1529 additions and 1172 deletions
|
@ -133,7 +133,18 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
#pragma mark - MWMPlacePageViewManager
|
||||
|
||||
- (void)dismissPlacePage { [self.placePageManager hidePlacePage]; }
|
||||
- (void)showPlacePage:(place_page::Info const &)info { [self.placePageManager showPlacePage:info]; }
|
||||
|
||||
- (void)showPlacePage:(place_page::Info const &)info
|
||||
{
|
||||
[self.placePageManager showPlacePage:info];
|
||||
if (IPAD)
|
||||
{
|
||||
auto ownerView = self.ownerController.view;
|
||||
[ownerView bringSubviewToFront:self.menuController.view];
|
||||
[ownerView bringSubviewToFront:self.navigationManager.routePreview];
|
||||
}
|
||||
}
|
||||
|
||||
- (MWMAlertViewController *)alertController { return self.ownerController.alertController; }
|
||||
- (void)searchViewDidEnterState:(MWMSearchManagerState)state
|
||||
{
|
||||
|
@ -454,10 +465,8 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
|
||||
- (id<MWMPlacePageProtocol>)placePageManager
|
||||
{
|
||||
auto const PlacePageClass = IPAD ? [MWMPlacePageViewManager class] : [MWMPlacePageManager class];
|
||||
|
||||
if (!_placePageManager)
|
||||
_placePageManager = [[PlacePageClass alloc] init];
|
||||
_placePageManager = [[MWMPlacePageManager alloc] init];
|
||||
return _placePageManager;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
enum class EButton // Required button's order
|
||||
{
|
||||
Api,
|
||||
Download,
|
||||
Booking,
|
||||
Opentable,
|
||||
Call,
|
||||
|
@ -15,6 +16,7 @@ enum class EButton // Required button's order
|
|||
NSString * titleForButton(EButton type, BOOL isSelected);
|
||||
|
||||
@class MWMActionBarButton;
|
||||
@class MWMCircularProgress;
|
||||
|
||||
@protocol MWMActionBarButtonDelegate <NSObject>
|
||||
|
||||
|
@ -31,4 +33,8 @@ NSString * titleForButton(EButton type, BOOL isSelected);
|
|||
buttonType:(EButton)type
|
||||
isSelected:(BOOL)isSelected;
|
||||
|
||||
- (EButton)type;
|
||||
- (MWMCircularProgress *)mapDownloadProgress;
|
||||
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#import "MWMActionBarButton.h"
|
||||
#import "Common.h"
|
||||
#import "MWMCircularProgress.h"
|
||||
#import "MWMButton.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
|
||||
|
@ -9,6 +10,8 @@ NSString * titleForButton(EButton type, BOOL isSelected)
|
|||
{
|
||||
case EButton::Api:
|
||||
return L(@"back");
|
||||
case EButton::Download:
|
||||
return L(@"download");
|
||||
case EButton::Booking:
|
||||
case EButton::Opentable:
|
||||
return L(@"book_button");
|
||||
|
@ -29,13 +32,15 @@ NSString * titleForButton(EButton type, BOOL isSelected)
|
|||
}
|
||||
}
|
||||
|
||||
@interface MWMActionBarButton ()
|
||||
@interface MWMActionBarButton () <MWMCircularProgressProtocol>
|
||||
|
||||
@property (weak, nonatomic) IBOutlet MWMButton * button;
|
||||
@property (weak, nonatomic) IBOutlet UILabel * label;
|
||||
|
||||
@property (weak, nonatomic) id<MWMActionBarButtonDelegate> delegate;
|
||||
@property (nonatomic) EButton type;
|
||||
@property(nonatomic) MWMCircularProgress * mapDownloadProgress;
|
||||
@property(nonatomic) UIView * progressWrapper;
|
||||
|
||||
@end
|
||||
|
||||
|
@ -56,6 +61,24 @@ NSString * titleForButton(EButton type, BOOL isSelected)
|
|||
case EButton::Api:
|
||||
[self.button setImage:[UIImage imageNamed:@"ic_back_api"] forState:UIControlStateNormal];
|
||||
break;
|
||||
case EButton::Download:
|
||||
{
|
||||
if (self.mapDownloadProgress)
|
||||
return;
|
||||
|
||||
self.progressWrapper = [[UIView alloc] init];
|
||||
[self.button addSubview:self.progressWrapper];
|
||||
|
||||
self.mapDownloadProgress = [MWMCircularProgress downloaderProgressForParentView:self.progressWrapper];
|
||||
self.mapDownloadProgress.delegate = self;
|
||||
|
||||
MWMCircularProgressStateVec const affectedStates = {MWMCircularProgressStateNormal,
|
||||
MWMCircularProgressStateSelected};
|
||||
|
||||
[self.mapDownloadProgress setImageName:@"ic_download" forStates:affectedStates];
|
||||
[self.mapDownloadProgress setColoring:MWMButtonColoringBlue forStates:affectedStates];
|
||||
break;
|
||||
}
|
||||
case EButton::Booking:
|
||||
[self.button setImage:[UIImage imageNamed:@"ic_booking_logo"] forState:UIControlStateNormal];
|
||||
self.label.textColor = [UIColor whiteColor];
|
||||
|
@ -105,6 +128,11 @@ NSString * titleForButton(EButton type, BOOL isSelected)
|
|||
[button configButton:isSelected];
|
||||
}
|
||||
|
||||
- (void)progressButtonPressed:(MWMCircularProgress *)progress
|
||||
{
|
||||
[self.delegate tapOnButtonWithType:EButton::Download];
|
||||
}
|
||||
|
||||
- (IBAction)tap
|
||||
{
|
||||
if (self.type == EButton::Bookmark)
|
||||
|
@ -143,8 +171,11 @@ NSString * titleForButton(EButton type, BOOL isSelected)
|
|||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
self.frame = self.superview.bounds;
|
||||
[super layoutSubviews];
|
||||
self.frame = self.superview.bounds;
|
||||
auto constexpr designOffset = 4;
|
||||
self.progressWrapper.size = {self.button.height - designOffset, self.button.height - designOffset};
|
||||
self.progressWrapper.center = self.button.center;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -72,7 +72,7 @@ NSString * const kTextViewContentSizeKeyPath = @"contentSize";
|
|||
[self stateOpen:NO];
|
||||
|
||||
[self setNeedsLayout];
|
||||
[self.updateCellDelegate updateCellWithForceReposition:NO];
|
||||
[self.updateCellDelegate updateCell];
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -201,5 +201,6 @@ NSString * const kTextViewContentSizeKeyPath = @"contentSize";
|
|||
[self setNeedsLayout];
|
||||
}
|
||||
|
||||
- (IBAction)editTap { [self.editBookmarkDelegate editBookmark]; }
|
||||
- (IBAction)editTap { [self.editBookmarkDelegate editBookmark];}
|
||||
|
||||
@end
|
||||
|
|
|
@ -54,23 +54,23 @@ enum RowInMetaInfo
|
|||
[super viewDidLoad];
|
||||
auto data = self.data;
|
||||
NSAssert(self.manager || data, @"Entity and data can't be nil both!");
|
||||
if (IPAD)
|
||||
{
|
||||
MWMPlacePageEntity * en = self.manager.entity;
|
||||
self.cachedDescription = en.bookmarkDescription;
|
||||
self.cachedTitle = en.bookmarkTitle;
|
||||
self.cachedCategory = en.bookmarkCategory;
|
||||
self.cachedColor = en.bookmarkColor;
|
||||
m_cachedBac = en.bac;
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (IPAD)
|
||||
// {
|
||||
// MWMPlacePageEntity * en = self.manager.entity;
|
||||
// self.cachedDescription = en.bookmarkDescription;
|
||||
// self.cachedTitle = en.bookmarkTitle;
|
||||
// self.cachedCategory = en.bookmarkCategory;
|
||||
// self.cachedColor = en.bookmarkColor;
|
||||
// m_cachedBac = en.bac;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
self.cachedDescription = data.bookmarkDescription;
|
||||
self.cachedTitle = data.externalTitle ? data.externalTitle : data.title;
|
||||
self.cachedCategory = data.bookmarkCategory;
|
||||
self.cachedColor = data.bookmarkColor;
|
||||
m_cachedBac = data.bac;
|
||||
}
|
||||
// }
|
||||
|
||||
[self configNavBar];
|
||||
[self registerCells];
|
||||
|
@ -109,19 +109,19 @@ enum RowInMetaInfo
|
|||
- (void)onSave
|
||||
{
|
||||
[self.view endEditing:YES];
|
||||
if (IPAD)
|
||||
{
|
||||
MWMPlacePageEntity * en = self.manager.entity;
|
||||
en.bookmarkDescription = self.cachedDescription;
|
||||
en.bookmarkColor = self.cachedColor;
|
||||
en.bookmarkCategory = self.cachedCategory;
|
||||
en.bookmarkTitle = self.cachedTitle;
|
||||
en.bac = m_cachedBac;
|
||||
[en synchronize];
|
||||
[self.manager reloadBookmark];
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (IPAD)
|
||||
// {
|
||||
// MWMPlacePageEntity * en = self.manager.entity;
|
||||
// en.bookmarkDescription = self.cachedDescription;
|
||||
// en.bookmarkColor = self.cachedColor;
|
||||
// en.bookmarkCategory = self.cachedCategory;
|
||||
// en.bookmarkTitle = self.cachedTitle;
|
||||
// en.bac = m_cachedBac;
|
||||
// [en synchronize];
|
||||
// [self.manager reloadBookmark];
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
Framework & f = GetFramework();
|
||||
BookmarkCategory * category = f.GetBmCategory(m_cachedBac.m_categoryIndex);
|
||||
if (!category)
|
||||
|
@ -141,15 +141,15 @@ enum RowInMetaInfo
|
|||
|
||||
category->SaveToKMLFile();
|
||||
f.UpdatePlacePageInfoForCurrentSelection();
|
||||
}
|
||||
// }
|
||||
[self backTap];
|
||||
}
|
||||
|
||||
- (void)backTap
|
||||
{
|
||||
if (IPAD)
|
||||
[self dismissViewControllerAnimated:YES completion:nil];
|
||||
else
|
||||
// if (IPAD)
|
||||
// [self dismissViewControllerAnimated:YES completion:nil];
|
||||
// else
|
||||
[super backTap];
|
||||
}
|
||||
|
||||
|
@ -277,15 +277,15 @@ enum RowInMetaInfo
|
|||
|
||||
- (void)cellSelect:(UITableViewCell *)cell
|
||||
{
|
||||
if (IPAD)
|
||||
{
|
||||
[self.manager removeBookmark];
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (IPAD)
|
||||
// {
|
||||
// [self.manager removeBookmark];
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
[self.data updateBookmarkStatus:NO];
|
||||
GetFramework().UpdatePlacePageInfoForCurrentSelection();
|
||||
}
|
||||
// }
|
||||
[self backTap];
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
#import "MWMTableViewCell.h"
|
||||
|
||||
@protocol MWMPlacePageCellUpdateProtocol;
|
||||
|
||||
@interface MWMOpeningHoursCell : MWMTableViewCell
|
||||
|
||||
- (void)configureWithOpeningHours:(NSString *)openingHours
|
||||
updateLayoutDelegate:(id<MWMPlacePageCellUpdateProtocol>)delegate
|
||||
isClosedNow:(BOOL)isClosedNow;
|
||||
@end
|
|
@ -1,243 +0,0 @@
|
|||
#import "MWMOpeningHoursCell.h"
|
||||
#import "Common.h"
|
||||
#import "MWMOpeningHours.h"
|
||||
#import "MWMPlacePageCellUpdateProtocol.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
#import "UIFont+MapsMeFonts.h"
|
||||
|
||||
#include "std/array.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
array<NSString *, 2> kOHClasses = {{@"_MWMOHHeaderCell", @"_MWMOHSubCell"}};
|
||||
void * kContext = &kContext;
|
||||
NSString * const kTableViewContentSizeKeyPath = @"contentSize";
|
||||
|
||||
NSAttributedString * richStringFromDay(osmoh::Day const & day, BOOL isClosedNow)
|
||||
{
|
||||
auto const richString = ^NSMutableAttributedString * (NSString * str, UIFont * font, UIColor * color)
|
||||
{
|
||||
return [[NSMutableAttributedString alloc] initWithString:str
|
||||
attributes:@{NSFontAttributeName : font,
|
||||
NSForegroundColorAttributeName : color}];
|
||||
};
|
||||
|
||||
auto str = richString(day.TodayTime(), [UIFont regular17], day.m_isOpen ? [UIColor blackPrimaryText] :
|
||||
[UIColor red]);
|
||||
if (day.m_isOpen)
|
||||
{
|
||||
auto lineBreak = [[NSAttributedString alloc] initWithString:@"\n"];
|
||||
|
||||
if (day.m_breaks.length)
|
||||
{
|
||||
[str appendAttributedString:lineBreak];
|
||||
[str appendAttributedString:richString(day.m_breaks, [UIFont regular13], [UIColor blackSecondaryText])];
|
||||
}
|
||||
|
||||
if (isClosedNow)
|
||||
{
|
||||
[str appendAttributedString:lineBreak];
|
||||
[str appendAttributedString:richString(L(@"closed_now"), [UIFont regular13], [UIColor red])];
|
||||
}
|
||||
|
||||
auto paragraphStyle = [[NSMutableParagraphStyle alloc] init];
|
||||
paragraphStyle.lineSpacing = 4;
|
||||
|
||||
[str addAttributes:@{NSParagraphStyleAttributeName : paragraphStyle} range:{0, str.length}];
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
#pragma mark - _MWMOHHeaderCell
|
||||
|
||||
@interface _MWMOHHeaderCell : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * text;
|
||||
@property(weak, nonatomic) IBOutlet UIImageView * arrowIcon;
|
||||
|
||||
@property(copy, nonatomic) TMWMVoidBlock tapAction;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMOHHeaderCell
|
||||
|
||||
- (IBAction)extendTap
|
||||
{
|
||||
if (!self.tapAction)
|
||||
return;
|
||||
|
||||
self.tapAction();
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
self.arrowIcon.transform =
|
||||
CGAffineTransformIsIdentity(self.arrowIcon.transform)
|
||||
? CGAffineTransformMakeRotation(M_PI)
|
||||
: CGAffineTransformIdentity;
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - _MWMOHSubCell
|
||||
|
||||
@interface _MWMOHSubCell : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * days;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * schedule;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * breaks;
|
||||
@property(weak, nonatomic) IBOutlet UIImageView * separator;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMOHSubCell
|
||||
|
||||
@end
|
||||
|
||||
@interface MWMOpeningHoursCell ()<UITableViewDelegate, UITableViewDataSource>
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UITableView * tableView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * tableViewHeight;
|
||||
@property(copy, nonatomic) NSString * rawString;
|
||||
|
||||
@property(weak, nonatomic) id<MWMPlacePageCellUpdateProtocol> delegate;
|
||||
|
||||
@property(nonatomic) BOOL isExtended;
|
||||
@property(nonatomic) BOOL isClosedNow;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMOpeningHoursCell
|
||||
{
|
||||
vector<osmoh::Day> m_days;
|
||||
}
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
[super awakeFromNib];
|
||||
for (auto s : kOHClasses)
|
||||
[self.tableView registerNib:[UINib nibWithNibName:s bundle:nil] forCellReuseIdentifier:s];
|
||||
|
||||
self.tableView.estimatedRowHeight = 48;
|
||||
self.tableView.rowHeight = UITableViewAutomaticDimension;
|
||||
[self registerObserver];
|
||||
}
|
||||
|
||||
- (void)configureWithOpeningHours:(NSString *)openingHours
|
||||
updateLayoutDelegate:(id<MWMPlacePageCellUpdateProtocol>)delegate
|
||||
isClosedNow:(BOOL)isClosedNow;
|
||||
{
|
||||
self.tableView.delegate = nil;
|
||||
self.tableView.dataSource = nil;
|
||||
self.isExtended = NO;
|
||||
self.delegate = delegate;
|
||||
self.isClosedNow = isClosedNow;
|
||||
// If we can't parse opening hours string then leave it as is.
|
||||
self.rawString = openingHours;
|
||||
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
||||
self->m_days = [MWMOpeningHours processRawString:openingHours];
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
self.tableView.delegate = self;
|
||||
self.tableView.dataSource = self;
|
||||
[self.tableView reloadData];
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
#pragma mark - UITableView
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
return self.isExtended && !m_days.empty() ? m_days.size() : 1;
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView
|
||||
cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
auto const & day = m_days[indexPath.row];
|
||||
|
||||
if (indexPath.row == 0)
|
||||
{
|
||||
_MWMOHHeaderCell * cell =
|
||||
[tableView dequeueReusableCellWithIdentifier:[_MWMOHHeaderCell className]];
|
||||
|
||||
if (m_days.size() > 1)
|
||||
{
|
||||
cell.tapAction = ^{
|
||||
self.isExtended = !self.isExtended;
|
||||
|
||||
NSMutableArray<NSIndexPath *> * ip = [@[] mutableCopy];
|
||||
|
||||
for (auto i = 1; i < self->m_days.size(); i++)
|
||||
[ip addObject:[NSIndexPath indexPathForRow:i inSection:0]];
|
||||
|
||||
if (self.isExtended)
|
||||
[self.tableView insertRowsAtIndexPaths:ip
|
||||
withRowAnimation:UITableViewRowAnimationAutomatic];
|
||||
else
|
||||
[self.tableView deleteRowsAtIndexPaths:ip
|
||||
withRowAnimation:UITableViewRowAnimationAutomatic];
|
||||
};
|
||||
cell.arrowIcon.hidden = NO;
|
||||
}
|
||||
else
|
||||
{
|
||||
cell.tapAction = nil;
|
||||
cell.arrowIcon.hidden = YES;
|
||||
}
|
||||
|
||||
// This means that we couldn't parse opening hours string.
|
||||
if (m_days.empty())
|
||||
cell.text.text = self.rawString;
|
||||
else
|
||||
cell.text.attributedText = richStringFromDay(day, self.isClosedNow);
|
||||
|
||||
return cell;
|
||||
}
|
||||
else
|
||||
{
|
||||
_MWMOHSubCell * cell = [tableView dequeueReusableCellWithIdentifier:[_MWMOHSubCell className]];
|
||||
cell.days.text = day.m_workingDays;
|
||||
cell.schedule.text = day.m_workingTimes ? day.m_workingTimes : L(@"closed");
|
||||
cell.breaks.text = day.m_breaks;
|
||||
cell.separator.hidden = indexPath.row == m_days.size() - 1;
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Observer's methods
|
||||
|
||||
- (void)dealloc { [self unregisterObserver]; }
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object
|
||||
change:(NSDictionary *)change
|
||||
context:(void *)context
|
||||
{
|
||||
if (context == kContext)
|
||||
{
|
||||
NSValue * s = change[@"new"];
|
||||
CGFloat const height = s.CGSizeValue.height;
|
||||
self.tableViewHeight.constant = height;
|
||||
[self setNeedsLayout];
|
||||
[self.delegate updateCellWithForceReposition:NO];
|
||||
return;
|
||||
}
|
||||
|
||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
||||
}
|
||||
|
||||
- (void)unregisterObserver
|
||||
{
|
||||
[self.tableView removeObserver:self forKeyPath:kTableViewContentSizeKeyPath context:kContext];
|
||||
}
|
||||
|
||||
- (void)registerObserver
|
||||
{
|
||||
[self.tableView addObserver:self
|
||||
forKeyPath:kTableViewContentSizeKeyPath
|
||||
options:NSKeyValueObservingOptionNew
|
||||
context:kContext];
|
||||
}
|
||||
@end
|
10
iphone/Maps/Classes/MWMOpeningHoursLayoutHelper.h
Normal file
10
iphone/Maps/Classes/MWMOpeningHoursLayoutHelper.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
@class MWMPlacePageData;
|
||||
|
||||
@interface MWMOpeningHoursLayoutHelper : NSObject
|
||||
|
||||
- (instancetype)initWithTableView:(UITableView *)tableView;
|
||||
- (void)registerCells;
|
||||
- (void)configWithData:(MWMPlacePageData *)data;
|
||||
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
|
||||
|
||||
@end
|
227
iphone/Maps/Classes/MWMOpeningHoursLayoutHelper.mm
Normal file
227
iphone/Maps/Classes/MWMOpeningHoursLayoutHelper.mm
Normal file
|
@ -0,0 +1,227 @@
|
|||
#import "MWMOpeningHoursLayoutHelper.h"
|
||||
#import "Common.h"
|
||||
#import "MWMOpeningHours.h"
|
||||
#import "MWMPlacePageData.h"
|
||||
#import "MWMTableViewCell.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
#import "UIFont+MapsMeFonts.h"
|
||||
|
||||
#include "std/array.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
array<NSString *, 2> kCells = {{@"_MWMOHHeaderCell", @"_MWMOHSubCell"}};
|
||||
|
||||
NSAttributedString * richStringFromDay(osmoh::Day const & day, BOOL isClosedNow)
|
||||
{
|
||||
auto const richString = ^NSMutableAttributedString * (NSString * str, UIFont * font, UIColor * color)
|
||||
{
|
||||
return [[NSMutableAttributedString alloc] initWithString:str
|
||||
attributes:@{NSFontAttributeName : font,
|
||||
NSForegroundColorAttributeName : color}];
|
||||
};
|
||||
|
||||
auto str = richString(day.TodayTime(), [UIFont regular17], day.m_isOpen ? [UIColor blackPrimaryText] :
|
||||
[UIColor red]);
|
||||
if (day.m_isOpen)
|
||||
{
|
||||
auto lineBreak = [[NSAttributedString alloc] initWithString:@"\n"];
|
||||
|
||||
if (day.m_breaks.length)
|
||||
{
|
||||
[str appendAttributedString:lineBreak];
|
||||
[str appendAttributedString:richString(day.m_breaks, [UIFont regular13], [UIColor blackSecondaryText])];
|
||||
}
|
||||
|
||||
if (isClosedNow)
|
||||
{
|
||||
[str appendAttributedString:lineBreak];
|
||||
[str appendAttributedString:richString(L(@"closed_now"), [UIFont regular13], [UIColor red])];
|
||||
}
|
||||
|
||||
auto paragraphStyle = [[NSMutableParagraphStyle alloc] init];
|
||||
paragraphStyle.lineSpacing = 4;
|
||||
|
||||
[str addAttributes:@{NSParagraphStyleAttributeName : paragraphStyle} range:{0, str.length}];
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@interface MWMPlacePageData()
|
||||
|
||||
- (vector<place_page::MetainfoRows> &)mutableMetainfoRows;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - _MWMOHHeaderCell
|
||||
|
||||
@interface _MWMOHHeaderCell : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * text;
|
||||
@property(weak, nonatomic) IBOutlet UIImageView * arrowIcon;
|
||||
|
||||
@property(copy, nonatomic) TMWMVoidBlock tapAction;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMOHHeaderCell
|
||||
|
||||
- (IBAction)extendTap
|
||||
{
|
||||
if (!self.tapAction)
|
||||
return;
|
||||
|
||||
self.tapAction();
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
self.arrowIcon.transform =
|
||||
CGAffineTransformIsIdentity(self.arrowIcon.transform)
|
||||
? CGAffineTransformMakeRotation(M_PI)
|
||||
: CGAffineTransformIdentity;
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - _MWMOHSubCell
|
||||
|
||||
@interface _MWMOHSubCell : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * days;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * schedule;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * breaks;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMOHSubCell
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface MWMOpeningHoursLayoutHelper()
|
||||
{
|
||||
vector<osmoh::Day> m_days;
|
||||
}
|
||||
|
||||
@property(weak, nonatomic) UITableView * tableView;
|
||||
@property(weak, nonatomic) MWMPlacePageData * data;
|
||||
|
||||
@property(copy, nonatomic) NSString * rawString;
|
||||
@property(nonatomic) BOOL isClosed;
|
||||
@property(nonatomic) BOOL isExtended;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMOpeningHoursLayoutHelper
|
||||
|
||||
- (instancetype)initWithTableView:(UITableView *)tableView
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
_tableView = tableView;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)registerCells
|
||||
{
|
||||
for (auto name : kCells)
|
||||
[self.tableView registerNib:[UINib nibWithNibName:name bundle:nil] forCellReuseIdentifier:name];
|
||||
}
|
||||
|
||||
- (void)configWithData:(MWMPlacePageData *)data
|
||||
{
|
||||
self.data = data;
|
||||
self.rawString = [data stringForRow:place_page::MetainfoRows::OpeningHours];
|
||||
self.isClosed = data.schedule == place_page::OpeningHours::Closed;
|
||||
m_days = [MWMOpeningHours processRawString:self.rawString];
|
||||
}
|
||||
|
||||
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
auto tableView = self.tableView;
|
||||
auto const & day = m_days[indexPath.row];
|
||||
|
||||
if (self.data.metainfoRows[indexPath.row] == place_page::MetainfoRows::OpeningHours)
|
||||
{
|
||||
_MWMOHHeaderCell * cell =
|
||||
[tableView dequeueReusableCellWithIdentifier:[_MWMOHHeaderCell className]];
|
||||
|
||||
if (m_days.size() > 1)
|
||||
{
|
||||
cell.tapAction = ^{
|
||||
self.isExtended = !self.isExtended;
|
||||
|
||||
NSMutableArray<NSIndexPath *> * ip = [@[] mutableCopy];
|
||||
|
||||
for (auto i = 1; i < self->m_days.size(); i++)
|
||||
[ip addObject:[NSIndexPath indexPathForRow:i inSection:1]];
|
||||
|
||||
if (self.isExtended)
|
||||
{
|
||||
[self extendMetainfoRowsWithSize:ip.count];
|
||||
[tableView insertRowsAtIndexPaths:ip
|
||||
withRowAnimation:UITableViewRowAnimationLeft];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self reduceMetainfoRows];
|
||||
[tableView deleteRowsAtIndexPaths:ip
|
||||
withRowAnimation:UITableViewRowAnimationLeft];
|
||||
}
|
||||
};
|
||||
cell.arrowIcon.hidden = NO;
|
||||
}
|
||||
else
|
||||
{
|
||||
cell.tapAction = nil;
|
||||
cell.arrowIcon.hidden = YES;
|
||||
}
|
||||
|
||||
// This means that we couldn't parse opening hours string.
|
||||
if (m_days.empty())
|
||||
cell.text.text = self.rawString;
|
||||
else
|
||||
cell.text.attributedText = richStringFromDay(day, self.isClosed);
|
||||
|
||||
return cell;
|
||||
}
|
||||
else
|
||||
{
|
||||
_MWMOHSubCell * cell = [tableView dequeueReusableCellWithIdentifier:[_MWMOHSubCell className]];
|
||||
cell.days.text = day.m_workingDays;
|
||||
cell.schedule.text = day.m_workingTimes ? day.m_workingTimes : L(@"closed");
|
||||
cell.breaks.text = day.m_breaks;
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)extendMetainfoRowsWithSize:(NSUInteger)size
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
NSAssert(false, @"Incorrect number of days!");
|
||||
return;
|
||||
}
|
||||
|
||||
auto & metainfoRows = self.data.mutableMetainfoRows;
|
||||
using place_page::MetainfoRows;
|
||||
|
||||
auto it = find(metainfoRows.begin(), metainfoRows.end(), MetainfoRows::OpeningHours);
|
||||
if (it == metainfoRows.end())
|
||||
{
|
||||
LOG(LERROR, ("Incorrect state!"));
|
||||
return;
|
||||
}
|
||||
|
||||
metainfoRows.insert(++it, size, MetainfoRows::ExtendedOpeningHours);
|
||||
}
|
||||
|
||||
- (void)reduceMetainfoRows
|
||||
{
|
||||
auto & metainfoRows = self.data.mutableMetainfoRows;
|
||||
metainfoRows.erase(remove(metainfoRows.begin(), metainfoRows.end(), place_page::MetainfoRows::ExtendedOpeningHours), metainfoRows.end());
|
||||
}
|
||||
|
||||
@end
|
14
iphone/Maps/Classes/MWMPPPreviewLayoutHelper.h
Normal file
14
iphone/Maps/Classes/MWMPPPreviewLayoutHelper.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
@class MWMPlacePageData;
|
||||
|
||||
@interface MWMPPPreviewLayoutHelper : NSObject
|
||||
|
||||
- (instancetype)initWithTableView:(UITableView *)tableView;
|
||||
- (void)registerCells;
|
||||
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
withData:(MWMPlacePageData *)data;
|
||||
|
||||
- (void)rotateDirectionArrowToAngle:(CGFloat)angle;
|
||||
- (void)setDistanceToObject:(NSString *)distance;
|
||||
- (CGFloat)height;
|
||||
|
||||
@end
|
271
iphone/Maps/Classes/MWMPPPreviewLayoutHelper.mm
Normal file
271
iphone/Maps/Classes/MWMPPPreviewLayoutHelper.mm
Normal file
|
@ -0,0 +1,271 @@
|
|||
#import "MWMPPPreviewLayoutHelper.h"
|
||||
#import "Common.h"
|
||||
#import "MWMDirectionView.h"
|
||||
#import "MWMPlacePageData.h"
|
||||
#import "MWMTableViewCell.h"
|
||||
#import "UIColor+MapsmeColor.h"
|
||||
|
||||
#include "std/array.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
array<NSString *, 7> kPreviewCells = {{@"_MWMPPPTitle", @"_MWMPPPExternalTitle", @"_MWMPPPSubtitle",
|
||||
@"_MWMPPPSchedule", @"_MWMPPPBooking", @"_MWMPPPAddress", @"_MWMPPPSpace"}};
|
||||
} // namespace
|
||||
|
||||
#pragma mark - Base
|
||||
// Base class for avoiding copy-paste in inheriting cells.
|
||||
@interface _MWMPPPCellBase : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * distance;
|
||||
@property(weak, nonatomic) IBOutlet UIImageView * compass;
|
||||
@property(weak, nonatomic) IBOutlet UIView * distanceView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * trailing;
|
||||
@property(copy, nonatomic) TMWMVoidBlock tapOnDistance;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPCellBase
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
self.separatorInset = {0, self.width / 2, 0, self.width / 2};
|
||||
}
|
||||
|
||||
- (IBAction)tap
|
||||
{
|
||||
if (self.tapOnDistance)
|
||||
self.tapOnDistance();
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - Title
|
||||
|
||||
@interface _MWMPPPTitle : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * title;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPTitle
|
||||
@end
|
||||
|
||||
#pragma mark - External Title
|
||||
|
||||
@interface _MWMPPPExternalTitle : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * externalTitle;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPExternalTitle
|
||||
@end
|
||||
|
||||
#pragma mark - Subtitle
|
||||
|
||||
@interface _MWMPPPSubtitle : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * subtitle;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPSubtitle
|
||||
@end
|
||||
|
||||
#pragma mark - Schedule
|
||||
|
||||
@interface _MWMPPPSchedule : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * schedule;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPSchedule
|
||||
@end
|
||||
|
||||
#pragma mark - Booking
|
||||
|
||||
@interface _MWMPPPBooking : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * rating;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * pricing;
|
||||
|
||||
- (void)configWithRating:(NSString *)rating pricing:(NSString *)pricing;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPBooking
|
||||
|
||||
- (void)configWithRating:(NSString *)rating pricing:(NSString *)pricing
|
||||
{
|
||||
self.rating.text = rating;
|
||||
self.pricing.text = pricing;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - Address
|
||||
|
||||
@interface _MWMPPPAddress : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * address;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPAddress
|
||||
@end
|
||||
|
||||
@interface MWMPPPreviewLayoutHelper ()
|
||||
|
||||
@property(weak, nonatomic) UITableView * tableView;
|
||||
|
||||
@property(weak, nonatomic) NSLayoutConstraint * distanceCellTrailing;
|
||||
@property(weak, nonatomic) UIView * distanceView;
|
||||
|
||||
@property(nonatomic) CGFloat leading;
|
||||
@property(nonatomic) MWMDirectionView * directionView;
|
||||
@property(copy, nonatomic) NSString * distance;
|
||||
@property(weak, nonatomic) UIImageView * compass;
|
||||
@property(nonatomic) NSIndexPath * lastCellIndexPath;
|
||||
@end
|
||||
|
||||
@implementation MWMPPPreviewLayoutHelper
|
||||
|
||||
- (instancetype)initWithTableView:(UITableView *)tableView
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
_tableView = tableView;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)registerCells
|
||||
{
|
||||
for (auto name : kPreviewCells)
|
||||
[self.tableView registerNib:[UINib nibWithNibName:name bundle:nil] forCellReuseIdentifier:name];
|
||||
}
|
||||
|
||||
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath withData:(MWMPlacePageData *)data
|
||||
{
|
||||
using namespace place_page;
|
||||
auto tableView = self.tableView;
|
||||
auto const row = data.previewRows[indexPath.row];
|
||||
auto cellName = kPreviewCells[static_cast<size_t>(row)];
|
||||
|
||||
// -2 because last cell is always the spacer cell.
|
||||
BOOL const isNeedToShowDistance = (indexPath.row == data.previewRows.size() - 2);
|
||||
|
||||
UITableViewCell * c = [tableView dequeueReusableCellWithIdentifier:cellName];
|
||||
switch(row)
|
||||
{
|
||||
case PreviewRows::Title:
|
||||
static_cast<_MWMPPPTitle *>(c).title.text = data.title;
|
||||
break;
|
||||
case PreviewRows::ExternalTitle:
|
||||
static_cast<_MWMPPPExternalTitle *>(c).externalTitle.text = data.externalTitle;
|
||||
break;
|
||||
case PreviewRows::Subtitle:
|
||||
static_cast<_MWMPPPSubtitle *>(c).subtitle.text = data.subtitle;
|
||||
break;
|
||||
case PreviewRows::Schedule:
|
||||
{
|
||||
auto scheduleCell = static_cast<_MWMPPPSchedule *>(c);
|
||||
switch (data.schedule)
|
||||
{
|
||||
case place_page::OpeningHours::AllDay:
|
||||
scheduleCell.schedule.text = L(@"twentyfour_seven");
|
||||
scheduleCell.schedule.textColor = [UIColor blackSecondaryText];
|
||||
break;
|
||||
case place_page::OpeningHours::Open:
|
||||
scheduleCell.schedule.text = L(@"editor_time_open");
|
||||
scheduleCell.schedule.textColor = [UIColor blackSecondaryText];
|
||||
break;
|
||||
case place_page::OpeningHours::Closed:
|
||||
scheduleCell.schedule.text = L(@"closed_now");
|
||||
scheduleCell.schedule.textColor = [UIColor red];
|
||||
break;
|
||||
case place_page::OpeningHours::Unknown: NSAssert(false, @"Incorrect schedule!"); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PreviewRows::Booking:
|
||||
{
|
||||
auto bookingCell = static_cast<_MWMPPPBooking *>(c);
|
||||
[bookingCell configWithRating:data.bookingRating pricing:data.bookingApproximatePricing];
|
||||
[data assignOnlinePriceToLabel:bookingCell.pricing];
|
||||
return c;
|
||||
}
|
||||
case PreviewRows::Address:
|
||||
static_cast<_MWMPPPAddress *>(c).address.text = data.address;
|
||||
break;
|
||||
case PreviewRows::Space:
|
||||
return c;
|
||||
}
|
||||
|
||||
auto baseCell = static_cast<_MWMPPPCellBase *>(c);
|
||||
if (isNeedToShowDistance)
|
||||
{
|
||||
[self showDistanceOnCell:baseCell withData:data];
|
||||
self.lastCellIndexPath = indexPath;
|
||||
}
|
||||
else
|
||||
[self hideDistanceOnCell:baseCell];
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
- (void)showDistanceOnCell:(_MWMPPPCellBase *)cell withData:(MWMPlacePageData *)data
|
||||
{
|
||||
cell.trailing.priority = UILayoutPriorityDefaultLow;
|
||||
cell.distance.text = self.distance;
|
||||
cell.tapOnDistance = ^{
|
||||
[self.directionView show];
|
||||
};
|
||||
[cell.contentView setNeedsLayout];
|
||||
self.compass = cell.compass;
|
||||
self.distanceCellTrailing = cell.trailing;
|
||||
self.distanceView = cell.distanceView;
|
||||
cell.distanceView.hidden = NO;
|
||||
|
||||
auto dv = self.directionView;
|
||||
dv.titleLabel.text = data.title;
|
||||
dv.typeLabel.text = data.subtitle;
|
||||
dv.distanceLabel.text = self.distance;
|
||||
}
|
||||
|
||||
- (void)hideDistanceOnCell:(_MWMPPPCellBase *)cell
|
||||
{
|
||||
cell.trailing.priority = UILayoutPriorityDefaultHigh;
|
||||
[cell.contentView setNeedsLayout];
|
||||
cell.distanceView.hidden = YES;
|
||||
}
|
||||
|
||||
- (void)rotateDirectionArrowToAngle:(CGFloat)angle
|
||||
{
|
||||
auto const t = CATransform3DMakeRotation(M_PI_2 - angle, 0, 0, 1);
|
||||
self.compass.layer.transform = t;
|
||||
self.directionView.directionArrow.layer.transform = t;
|
||||
}
|
||||
|
||||
- (void)setDistanceToObject:(NSString *)distance
|
||||
{
|
||||
if (!distance.length)
|
||||
return;
|
||||
|
||||
if ([self.distance isEqualToString:distance])
|
||||
return;
|
||||
|
||||
self.distance = distance;
|
||||
self.directionView.distanceLabel.text = distance;
|
||||
}
|
||||
|
||||
- (CGFloat)height
|
||||
{
|
||||
auto const rect = [self.tableView rectForRowAtIndexPath:self.lastCellIndexPath];
|
||||
return rect.origin.y + rect.size.height;
|
||||
}
|
||||
|
||||
@end
|
|
@ -62,7 +62,7 @@ CGFloat const kTableViewTopInset = -36;
|
|||
{
|
||||
NSValue * s = change[@"new"];
|
||||
CGFloat const height = s.CGSizeValue.height;
|
||||
if (!equalScreenDimensions(height, self.currentContentHeight))
|
||||
if (!equalScreenDimensions(height, self.currentContentHeight) && !self.tableView.scrollEnabled)
|
||||
{
|
||||
self.currentContentHeight = height;
|
||||
self.height = height + self.top.height;
|
||||
|
@ -85,7 +85,9 @@ CGFloat const kTableViewTopInset = -36;
|
|||
|
||||
self.tableView.estimatedRowHeight = 44.;
|
||||
self.tableView.rowHeight = UITableViewAutomaticDimension;
|
||||
self.tableView.contentInset = {.top = kTableViewTopInset};
|
||||
self.tableView.contentInset = {.top = kTableViewTopInset, .bottom = - kTableViewTopInset};
|
||||
if (IPAD)
|
||||
self.autoresizingMask = UIViewAutoresizingNone;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" style="grouped" separatorStyle="default" allowsSelection="NO" rowHeight="44" sectionHeaderHeight="1" sectionFooterHeight="18" translatesAutoresizingMaskIntoConstraints="NO" id="Taj-ne-CBp">
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" style="grouped" separatorStyle="default" allowsSelectionDuringEditing="YES" rowHeight="44" sectionHeaderHeight="1" sectionFooterHeight="18" translatesAutoresizingMaskIntoConstraints="NO" id="Taj-ne-CBp">
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||
<inset key="separatorInset" minX="60" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
|
@ -47,7 +47,6 @@
|
|||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="-1" id="DCG-Kf-hkI"/>
|
||||
<outlet property="delegate" destination="-1" id="uu3-sb-3Ee"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
@class MWMPlacePageViewManager;
|
||||
@class MWMPlacePageData;
|
||||
|
||||
#import "MWMCircularProgress.h"
|
||||
|
||||
@protocol MWMActionBarSharedData<NSObject>
|
||||
|
||||
- (BOOL)isBookmark;
|
||||
|
@ -21,7 +23,11 @@
|
|||
+ (MWMPlacePageActionBar *)actionBarWithDelegate:(id<MWMActionBarProtocol>)delegate;
|
||||
- (void)configureWithData:(id<MWMActionBarSharedData>)data;
|
||||
|
||||
@property (nonatomic) BOOL isBookmark;
|
||||
@property(nonatomic) BOOL isBookmark;
|
||||
@property(nonatomic) BOOL isAreaNotDownloaded;
|
||||
|
||||
- (void)setDownloadingProgress:(CGFloat)progress;
|
||||
- (void)setDownloadingState:(MWMCircularProgressState)state;
|
||||
|
||||
- (UIView *)shareAnchor;
|
||||
- (BOOL)isPrepareRouteMode;
|
||||
|
|
|
@ -70,8 +70,7 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
{
|
||||
m_visibleButtons.clear();
|
||||
m_additionalButtons.clear();
|
||||
auto data =
|
||||
static_cast<id<MWMActionBarSharedData>>(IPAD ? self.placePageManager.entity : self.data);
|
||||
auto data = self.data;
|
||||
NSString * phone = data.phoneNumber;
|
||||
|
||||
BOOL const isIphone = [[UIDevice currentDevice].model isEqualToString:@"iPhone"];
|
||||
|
@ -86,7 +85,14 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
|
||||
EButton const sponsoredButton = isBooking ? EButton::Booking : EButton::Opentable;
|
||||
|
||||
if (isMyPosition)
|
||||
if (self.isAreaNotDownloaded)
|
||||
{
|
||||
m_visibleButtons.push_back(EButton::Download);
|
||||
m_visibleButtons.push_back(EButton::Bookmark);
|
||||
m_visibleButtons.push_back(EButton::RouteTo);
|
||||
m_visibleButtons.push_back(EButton::Share);
|
||||
}
|
||||
else if (isMyPosition)
|
||||
{
|
||||
m_visibleButtons.push_back(EButton::Spacer);
|
||||
m_visibleButtons.push_back(EButton::Bookmark);
|
||||
|
@ -157,7 +163,7 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
m_visibleButtons.push_back(EButton::RouteFrom);
|
||||
}
|
||||
|
||||
if (!isMyPosition)
|
||||
if (!isMyPosition || !self.isAreaNotDownloaded)
|
||||
{
|
||||
m_visibleButtons.push_back(EButton::RouteTo);
|
||||
m_visibleButtons.push_back(m_additionalButtons.empty() ? EButton::Share : EButton::More);
|
||||
|
@ -174,6 +180,43 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
}
|
||||
}
|
||||
|
||||
- (void)setDownloadingState:(MWMCircularProgressState)state
|
||||
{
|
||||
MWMCircularProgress * p = self.progressFromActiveButton;
|
||||
p.state = state;
|
||||
}
|
||||
|
||||
- (void)setDownloadingProgress:(CGFloat)progress
|
||||
{
|
||||
MWMCircularProgress * p = self.progressFromActiveButton;
|
||||
p.progress = progress;
|
||||
}
|
||||
|
||||
- (MWMCircularProgress *)progressFromActiveButton
|
||||
{
|
||||
if (!self.isAreaNotDownloaded)
|
||||
return nil;
|
||||
|
||||
for (UIView * view in self.buttons)
|
||||
{
|
||||
MWMActionBarButton * button = view.subviews[0];
|
||||
if (button.type != EButton::Download)
|
||||
continue;
|
||||
|
||||
return button.mapDownloadProgress;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setIsAreaNotDownloaded:(BOOL)isAreaNotDownloaded
|
||||
{
|
||||
if (_isAreaNotDownloaded == isAreaNotDownloaded)
|
||||
return;
|
||||
|
||||
_isAreaNotDownloaded = isAreaNotDownloaded;
|
||||
[self configureButtons];
|
||||
}
|
||||
|
||||
- (UIView *)shareAnchor
|
||||
{
|
||||
UIView * last = nil;
|
||||
|
@ -190,11 +233,12 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
|
||||
- (void)tapOnButtonWithType:(EButton)type
|
||||
{
|
||||
id<MWMActionBarProtocol> delegate = IPAD ? self.placePageManager : self.delegate;
|
||||
id<MWMActionBarProtocol> delegate = self.delegate;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case EButton::Api: [delegate apiBack]; break;
|
||||
case EButton::Download: [delegate downloadSelectedArea]; break;
|
||||
case EButton::Opentable:
|
||||
case EButton::Booking: [delegate book:NO]; break;
|
||||
case EButton::Call: [delegate call]; break;
|
||||
|
@ -219,8 +263,7 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
- (void)showActionSheet
|
||||
{
|
||||
NSString * cancel = L(@"cancel");
|
||||
auto data =
|
||||
static_cast<id<MWMActionBarSharedData>>(IPAD ? self.placePageManager.entity : self.data);
|
||||
auto data = self.data;
|
||||
BOOL const isTitleNotEmpty = data.title.length > 0;
|
||||
NSString * title = isTitleNotEmpty ? data.title : data.subtitle;
|
||||
NSString * subtitle = isTitleNotEmpty ? data.subtitle : nil;
|
||||
|
@ -272,7 +315,7 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
[super layoutSubviews];
|
||||
self.width = self.superview.width;
|
||||
if (IPAD)
|
||||
self.origin = {0, self.superview.height - self.height};
|
||||
self.maxY = self.superview.height;
|
||||
|
||||
self.separator.width = self.width;
|
||||
CGFloat const buttonWidth = self.width / self.buttons.count;
|
||||
|
|
|
@ -63,20 +63,6 @@
|
|||
|
||||
- (IBAction)buttonTap
|
||||
{
|
||||
if (IPAD)
|
||||
{
|
||||
auto m = self.manager;
|
||||
switch (self.type)
|
||||
{
|
||||
case MWMPlacePageCellTypeEditButton: [m editPlace]; break;
|
||||
case MWMPlacePageCellTypeAddBusinessButton: [m addBusiness]; break;
|
||||
case MWMPlacePageCellTypeAddPlaceButton: [m addPlace]; break;
|
||||
case MWMPlacePageCellTypeBookingMore: [m book:YES]; break;
|
||||
default: NSAssert(false, @"Incorrect cell type!"); break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
using namespace place_page;
|
||||
auto d = self.delegate;
|
||||
switch (self.rowType)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
@protocol MWMPlacePageCellUpdateProtocol<NSObject>
|
||||
|
||||
- (void)updateCellWithForceReposition:(BOOL)isForceReposition;
|
||||
- (void)updateCell;
|
||||
|
||||
@end
|
||||
|
|
|
@ -12,9 +12,21 @@ enum class Sections
|
|||
Buttons
|
||||
};
|
||||
|
||||
enum class PreviewRows
|
||||
{
|
||||
Title,
|
||||
ExternalTitle,
|
||||
Subtitle,
|
||||
Schedule,
|
||||
Booking,
|
||||
Address,
|
||||
Space
|
||||
};
|
||||
|
||||
enum class MetainfoRows
|
||||
{
|
||||
OpeningHours,
|
||||
ExtendedOpeningHours,
|
||||
Phone,
|
||||
Address,
|
||||
Website,
|
||||
|
@ -81,6 +93,7 @@ enum class OpeningHours
|
|||
|
||||
// Table view's data
|
||||
- (vector<place_page::Sections> const &)sections;
|
||||
- (vector<place_page::PreviewRows> const &)previewRows;
|
||||
- (vector<place_page::MetainfoRows> const &)metainfoRows;
|
||||
- (vector<place_page::ButtonsRows> const &)buttonsRows;
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ using namespace place_page;
|
|||
Info m_info;
|
||||
|
||||
vector<Sections> m_sections;
|
||||
vector<PreviewRows> m_previewRows;
|
||||
vector<MetainfoRows> m_metainfoRows;
|
||||
vector<ButtonsRows> m_buttonsRows;
|
||||
}
|
||||
|
@ -38,10 +39,12 @@ using namespace place_page;
|
|||
- (void)fillSections
|
||||
{
|
||||
m_sections.clear();
|
||||
m_previewRows.clear();
|
||||
m_metainfoRows.clear();
|
||||
m_buttonsRows.clear();
|
||||
|
||||
m_sections.push_back(Sections::Preview);
|
||||
[self fillPreviewSection];
|
||||
|
||||
// It's bookmark.
|
||||
if (m_info.IsBookmark())
|
||||
|
@ -60,6 +63,17 @@ using namespace place_page;
|
|||
}
|
||||
}
|
||||
|
||||
- (void)fillPreviewSection
|
||||
{
|
||||
if (self.title.length) m_previewRows.push_back(PreviewRows::Title);
|
||||
if (self.externalTitle.length) m_previewRows.push_back(PreviewRows::ExternalTitle);
|
||||
if (self.subtitle.length) m_previewRows.push_back(PreviewRows::Subtitle);
|
||||
if (self.schedule != OpeningHours::Unknown) m_previewRows.push_back(PreviewRows::Schedule);
|
||||
if (self.isBooking) m_previewRows.push_back(PreviewRows::Booking);
|
||||
if (self.address.length) m_previewRows.push_back(PreviewRows::Address);
|
||||
m_previewRows.push_back(PreviewRows::Space);
|
||||
}
|
||||
|
||||
- (void)fillMetaInfoSection
|
||||
{
|
||||
using namespace osm;
|
||||
|
@ -282,12 +296,15 @@ using namespace place_page;
|
|||
}
|
||||
|
||||
- (vector<Sections> const &)sections { return m_sections; }
|
||||
- (vector<PreviewRows> const &)previewRows { return m_previewRows; }
|
||||
- (vector<MetainfoRows> const &)metainfoRows { return m_metainfoRows; }
|
||||
- (vector<MetainfoRows> &)mutableMetainfoRows { return m_metainfoRows; }
|
||||
- (vector<ButtonsRows> const &)buttonsRows { return m_buttonsRows; }
|
||||
- (NSString *)stringForRow:(MetainfoRows)row
|
||||
{
|
||||
switch (row)
|
||||
{
|
||||
case MetainfoRows::ExtendedOpeningHours: return nil;
|
||||
case MetainfoRows::OpeningHours: return @(m_info.GetOpeningHours().c_str());
|
||||
case MetainfoRows::Phone: return @(m_info.GetPhone().c_str());
|
||||
case MetainfoRows::Address: return @(m_info.GetAddress().c_str());
|
||||
|
|
|
@ -166,29 +166,29 @@
|
|||
|
||||
- (IBAction)cellTap
|
||||
{
|
||||
if (IPAD)
|
||||
{
|
||||
switch (self.type)
|
||||
{
|
||||
case MWMPlacePageCellTypeURL:
|
||||
case MWMPlacePageCellTypeWebsite:
|
||||
[Statistics logEvent:kStatEventName(kStatPlacePage, kStatOpenSite)];
|
||||
break;
|
||||
case MWMPlacePageCellTypeEmail:
|
||||
[Statistics logEvent:kStatEventName(kStatPlacePage, kStatSendEmail)];
|
||||
break;
|
||||
case MWMPlacePageCellTypePhoneNumber:
|
||||
[Statistics logEvent:kStatEventName(kStatPlacePage, kStatCallPhoneNumber)];
|
||||
break;
|
||||
case MWMPlacePageCellTypeCoordinate:
|
||||
[Statistics logEvent:kStatEventName(kStatPlacePage, kStatToggleCoordinates)];
|
||||
[self.currentEntity toggleCoordinateSystem];
|
||||
[self changeText:[self.currentEntity getCellValue:MWMPlacePageCellTypeCoordinate]];
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
// if (IPAD)
|
||||
// {
|
||||
// switch (self.type)
|
||||
// {
|
||||
// case MWMPlacePageCellTypeURL:
|
||||
// case MWMPlacePageCellTypeWebsite:
|
||||
// [Statistics logEvent:kStatEventName(kStatPlacePage, kStatOpenSite)];
|
||||
// break;
|
||||
// case MWMPlacePageCellTypeEmail:
|
||||
// [Statistics logEvent:kStatEventName(kStatPlacePage, kStatSendEmail)];
|
||||
// break;
|
||||
// case MWMPlacePageCellTypePhoneNumber:
|
||||
// [Statistics logEvent:kStatEventName(kStatPlacePage, kStatCallPhoneNumber)];
|
||||
// break;
|
||||
// case MWMPlacePageCellTypeCoordinate:
|
||||
// [Statistics logEvent:kStatEventName(kStatPlacePage, kStatToggleCoordinates)];
|
||||
// [self.currentEntity toggleCoordinateSystem];
|
||||
// [self changeText:[self.currentEntity getCellValue:MWMPlacePageCellTypeCoordinate]];
|
||||
// break;
|
||||
// default: break;
|
||||
// }
|
||||
// return;
|
||||
// }
|
||||
|
||||
switch (self.rowType)
|
||||
{
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
@protocol MWMPlacePageLayoutDelegate<NSObject>
|
||||
|
||||
- (void)onTopBoundChanged:(CGFloat)bound;
|
||||
- (void)onPlacePageTopBoundChanged:(CGFloat)bound;
|
||||
- (void)shouldDestroyLayout;
|
||||
|
||||
@end
|
||||
|
@ -11,6 +11,8 @@
|
|||
|
||||
- (NSString *)distanceToObject;
|
||||
- (void)downloadSelectedArea;
|
||||
- (CGFloat)leftBound;
|
||||
- (CGFloat)topBound;
|
||||
|
||||
@end
|
||||
|
||||
|
@ -40,4 +42,10 @@
|
|||
|
||||
- (void)processDownloaderEventWithStatus:(storage::NodeStatus)status progress:(CGFloat)progress;
|
||||
|
||||
#pragma mark - iPad only
|
||||
|
||||
- (void)updateTopBound;
|
||||
- (void)updateLeftBound;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -1,70 +1,44 @@
|
|||
#import "MWMPlacePageLayout.h"
|
||||
#import "MWMiPadPlacePageLayoutImpl.h"
|
||||
#import "MWMiPhonePlacePageLayoutImpl.h"
|
||||
#import "MWMCircularProgress.h"
|
||||
#import "MWMPPView.h"
|
||||
#import "MWMPlacePageActionBar.h"
|
||||
#import "MWMPlacePageCellUpdateProtocol.h"
|
||||
#import "MWMPlacePageData.h"
|
||||
#import "MWMPPPreviewLayoutHelper.h"
|
||||
#import "MWMBookmarkCell.h"
|
||||
#import "MWMOpeningHoursCell.h"
|
||||
#import "MWMOpeningHoursLayoutHelper.h"
|
||||
#import "MWMPlacePageBookmarkCell.h"
|
||||
#import "MWMPlacePageButtonCell.h"
|
||||
#import "MWMPlacePageInfoCell.h"
|
||||
#import "MWMPlacePagePreviewCell.h"
|
||||
#import "MWMPlacePageLayoutImpl.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
|
||||
#include "storage/storage.hpp"
|
||||
|
||||
#include "std/array.hpp"
|
||||
#include "std/map.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
enum class ScrollDirection
|
||||
{
|
||||
Up,
|
||||
Down
|
||||
};
|
||||
|
||||
enum class State
|
||||
{
|
||||
Bottom,
|
||||
Top
|
||||
};
|
||||
|
||||
// Minimal offset for collapse. If place page offset is below this value we should hide place page.
|
||||
CGFloat const kMinOffset = 1;
|
||||
CGFloat const kOpenPlacePageStopValue = 0.7;
|
||||
CGFloat const kLuftDraggingOffset = 30;
|
||||
|
||||
array<NSString *, 1> kPreviewCells = {{@"MWMPlacePagePreviewCell"}};
|
||||
|
||||
array<NSString *, 1> kBookmarkCells = {{@"MWMBookmarkCell"}};
|
||||
|
||||
array<NSString *, 9> kMetaInfoCells = {
|
||||
{@"MWMOpeningHoursCell", @"PlacePageLinkCell", @"PlacePageInfoCell", @"PlacePageLinkCell",
|
||||
@"PlacePageLinkCell", @"PlacePageInfoCell", @"PlacePageInfoCell", @"PlacePageInfoCell",
|
||||
@"PlacePageInfoCell"}};
|
||||
using place_page::MetainfoRows;
|
||||
|
||||
map<MetainfoRows, NSString *> const kMetaInfoCells = {
|
||||
{MetainfoRows::Website, @"PlacePageLinkCell"},
|
||||
{MetainfoRows::Address, @"PlacePageInfoCell"},
|
||||
{MetainfoRows::Email, @"PlacePageLinkCell"},
|
||||
{MetainfoRows::Phone, @"PlacePageLinkCell"},
|
||||
{MetainfoRows::Cuisine, @"PlacePageInfoCell"},
|
||||
{MetainfoRows::Operator, @"PlacePageInfoCell"},
|
||||
{MetainfoRows::Coordinate, @"PlacePageInfoCell"},
|
||||
{MetainfoRows::Internet, @"PlacePageInfoCell"}};
|
||||
|
||||
array<NSString *, 1> kButtonsCells = {{@"MWMPlacePageButtonCell"}};
|
||||
|
||||
NSTimeInterval const kAnimationDuration = 0.25;
|
||||
|
||||
void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
||||
{
|
||||
[UIView animateWithDuration:kAnimationDuration
|
||||
delay:0
|
||||
options:UIViewAnimationOptionCurveEaseIn
|
||||
animations:^{
|
||||
animate();
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
if (completion)
|
||||
completion();
|
||||
}];
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@interface MWMPlacePageLayout ()<UITableViewDelegate, UITableViewDataSource,
|
||||
@interface MWMPlacePageLayout () <UITableViewDataSource,
|
||||
MWMPlacePageCellUpdateProtocol, MWMPlacePageViewUpdateProtocol>
|
||||
|
||||
@property(weak, nonatomic) MWMPlacePageData * data;
|
||||
|
@ -74,19 +48,8 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
id<MWMPlacePageLayoutDelegate, MWMPlacePageButtonsProtocol, MWMActionBarProtocol>
|
||||
delegate;
|
||||
@property(weak, nonatomic) id<MWMPlacePageLayoutDataSource> dataSource;
|
||||
|
||||
@property(nonatomic) MWMPPScrollView * scrollView;
|
||||
@property(nonatomic) IBOutlet MWMPPView * placePageView;
|
||||
|
||||
@property(nonatomic) ScrollDirection direction;
|
||||
@property(nonatomic) State state;
|
||||
|
||||
@property(nonatomic) CGFloat portraitOpenContentOffset;
|
||||
@property(nonatomic) CGFloat landscapeOpenContentOffset;
|
||||
@property(nonatomic) CGFloat lastContentOffset;
|
||||
@property(nonatomic) CGFloat expandedContentOffset;
|
||||
|
||||
@property(nonatomic) MWMPlacePagePreviewCell * ppPreviewCell;
|
||||
@property(nonatomic) MWMBookmarkCell * bookmarkCell;
|
||||
|
||||
@property(nonatomic) MWMPlacePageActionBar * actionBar;
|
||||
|
@ -94,6 +57,11 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
@property(nonatomic) BOOL isPlacePageButtonsEnabled;
|
||||
@property(nonatomic) BOOL isDownloaderViewShown;
|
||||
|
||||
@property(nonatomic) id<MWMPlacePageLayoutImpl> layoutImpl;
|
||||
|
||||
@property(nonatomic) MWMPPPreviewLayoutHelper * previewLayoutHelper;
|
||||
@property(nonatomic) MWMOpeningHoursLayoutHelper * openingHoursLayoutHelper;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMPlacePageLayout
|
||||
|
@ -109,17 +77,18 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
_ownerView = view;
|
||||
_delegate = delegate;
|
||||
_dataSource = dataSource;
|
||||
|
||||
[[NSBundle mainBundle] loadNibNamed:[MWMPPView className] owner:self options:nil];
|
||||
auto view = self.ownerView;
|
||||
auto const & size = view.size;
|
||||
_placePageView.frame = {{0, size.height}, size};
|
||||
_placePageView.delegate = self;
|
||||
_scrollView = [[MWMPPScrollView alloc] initWithFrame:view.frame inactiveView:_placePageView];
|
||||
_portraitOpenContentOffset = MAX(size.width, size.height) * kOpenPlacePageStopValue;
|
||||
_landscapeOpenContentOffset = MIN(size.width, size.height) * kOpenPlacePageStopValue;
|
||||
[view addSubview:_scrollView];
|
||||
[_scrollView addSubview:_placePageView];
|
||||
auto const Impl = IPAD ? [MWMiPadPlacePageLayoutImpl class] : [MWMiPhonePlacePageLayoutImpl class];
|
||||
_layoutImpl = [[Impl alloc] initOwnerView:view placePageView:_placePageView delegate:delegate];
|
||||
|
||||
if ([_layoutImpl respondsToSelector:@selector(setInitialTopBound:leftBound:)])
|
||||
[_layoutImpl setInitialTopBound:dataSource.topBound leftBound:dataSource.leftBound];
|
||||
|
||||
auto tableView = _placePageView.tableView;
|
||||
_previewLayoutHelper = [[MWMPPPreviewLayoutHelper alloc]
|
||||
initWithTableView:tableView];
|
||||
_openingHoursLayoutHelper = [[MWMOpeningHoursLayoutHelper alloc] initWithTableView:tableView];
|
||||
[self registerCells];
|
||||
}
|
||||
return self;
|
||||
|
@ -129,26 +98,25 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
{
|
||||
auto tv = self.placePageView.tableView;
|
||||
|
||||
[tv registerNib:[UINib nibWithNibName:kPreviewCells[0] bundle:nil]
|
||||
forCellReuseIdentifier:kPreviewCells[0]];
|
||||
[tv registerNib:[UINib nibWithNibName:kButtonsCells[0] bundle:nil]
|
||||
forCellReuseIdentifier:kButtonsCells[0]];
|
||||
[tv registerNib:[UINib nibWithNibName:kBookmarkCells[0] bundle:nil]
|
||||
forCellReuseIdentifier:kBookmarkCells[0]];
|
||||
|
||||
// Register all meta info cells.
|
||||
for (auto const name : kMetaInfoCells)
|
||||
[tv registerNib:[UINib nibWithNibName:name bundle:nil] forCellReuseIdentifier:name];
|
||||
[self.previewLayoutHelper registerCells];
|
||||
[self.openingHoursLayoutHelper registerCells];
|
||||
|
||||
// Register all meta info cells.
|
||||
for (auto const & pair : kMetaInfoCells)
|
||||
{
|
||||
NSString * name = pair.second;
|
||||
[tv registerNib:[UINib nibWithNibName:name bundle:nil] forCellReuseIdentifier:name];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)layoutWithSize:(CGSize const &)size
|
||||
{
|
||||
self.scrollView.frame = {{}, size};
|
||||
self.placePageView.origin = {0., size.height};
|
||||
self.actionBar.frame = {{0., size.height - self.actionBar.height},
|
||||
{size.width, self.actionBar.height}};
|
||||
[self.delegate onTopBoundChanged:self.scrollView.contentOffset.y];
|
||||
[self.layoutImpl onScreenResize:size];
|
||||
}
|
||||
|
||||
- (UIView *)shareAnchor { return self.actionBar.shareAnchor; }
|
||||
|
@ -156,26 +124,27 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
{
|
||||
self.isPlacePageButtonsEnabled = YES;
|
||||
self.data = data;
|
||||
self.ppPreviewCell = nil;
|
||||
self.bookmarkCell = nil;
|
||||
|
||||
self.scrollView.delegate = self;
|
||||
self.state = State::Bottom;
|
||||
|
||||
[self collapse];
|
||||
[self.layoutImpl onShow];
|
||||
|
||||
[self.actionBar configureWithData:static_cast<id<MWMActionBarSharedData>>(data)];
|
||||
[self.openingHoursLayoutHelper configWithData:data];
|
||||
[self.placePageView.tableView reloadData];
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if ([self.layoutImpl respondsToSelector:@selector(onExpandWithPlacePagePreviewHeight:)])
|
||||
[self.layoutImpl onExpandWithPlacePagePreviewHeight:self.previewLayoutHelper.height];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)rotateDirectionArrowToAngle:(CGFloat)angle
|
||||
{
|
||||
[self.ppPreviewCell rotateDirectionArrowToAngle:angle];
|
||||
[self.previewLayoutHelper rotateDirectionArrowToAngle:angle];
|
||||
}
|
||||
|
||||
- (void)setDistanceToObject:(NSString *)distance
|
||||
{
|
||||
[self.ppPreviewCell setDistanceToObject:distance];
|
||||
[self.previewLayoutHelper setDistanceToObject:distance];
|
||||
}
|
||||
|
||||
- (MWMPlacePageActionBar *)actionBar
|
||||
|
@ -183,25 +152,14 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
if (!_actionBar)
|
||||
{
|
||||
_actionBar = [MWMPlacePageActionBar actionBarWithDelegate:self.delegate];
|
||||
UIView * superview = self.ownerView;
|
||||
_actionBar.origin = {0., superview.height};
|
||||
[superview addSubview:_actionBar];
|
||||
[self.layoutImpl onActionBarInit:_actionBar];
|
||||
}
|
||||
return _actionBar;
|
||||
}
|
||||
|
||||
- (void)close
|
||||
{
|
||||
animate(
|
||||
^{
|
||||
self.actionBar.origin = {0., self.ownerView.height};
|
||||
[self.scrollView setContentOffset:{} animated:YES];
|
||||
},
|
||||
^{
|
||||
[self.actionBar removeFromSuperview];
|
||||
self.actionBar = nil;
|
||||
[self.delegate shouldDestroyLayout];
|
||||
});
|
||||
[self.layoutImpl onClose];
|
||||
}
|
||||
|
||||
- (void)mwm_refreshUI
|
||||
|
@ -230,56 +188,6 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
}
|
||||
}
|
||||
|
||||
- (void)collapse
|
||||
{;
|
||||
self.scrollView.scrollEnabled = NO;
|
||||
[self.placePageView hideTableView:YES];
|
||||
|
||||
animate(^{
|
||||
[self.scrollView setContentOffset:{ 0., kMinOffset } animated:YES];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)expand
|
||||
{
|
||||
self.actionBar.hidden = NO;
|
||||
self.scrollView.scrollEnabled = YES;
|
||||
|
||||
animate(^{
|
||||
[self.placePageView hideTableView:NO];
|
||||
self.actionBar.minY = self.actionBar.superview.height - self.actionBar.height;
|
||||
|
||||
// We decrease expanded offset for 2 pixels because it looks more clear.
|
||||
auto constexpr designOffset = 2;
|
||||
self.expandedContentOffset =
|
||||
self.ppPreviewCell.height + self.placePageView.top.height + self.actionBar.height - designOffset;
|
||||
|
||||
auto const targetOffset =
|
||||
self.state == State::Bottom ? self.expandedContentOffset : self.topContentOffset;
|
||||
[self.scrollView setContentOffset:{ 0, targetOffset } animated:YES];
|
||||
});
|
||||
}
|
||||
|
||||
- (BOOL)isPortrait
|
||||
{
|
||||
auto const & s = self.ownerView.size;
|
||||
return s.height > s.width;
|
||||
}
|
||||
|
||||
- (CGFloat)openContentOffset
|
||||
{
|
||||
return self.isPortrait ? self.portraitOpenContentOffset : self.landscapeOpenContentOffset;
|
||||
}
|
||||
|
||||
- (CGFloat)topContentOffset
|
||||
{
|
||||
auto const target = self.openContentOffset;
|
||||
if (target > self.placePageView.height)
|
||||
return self.placePageView.height;
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
#pragma mark - Downloader event
|
||||
|
||||
- (void)processDownloaderEventWithStatus:(storage::NodeStatus)status progress:(CGFloat)progress
|
||||
|
@ -300,27 +208,25 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
reloadSections:[NSIndexSet indexSetWithIndex:distance(sections.begin(), it)]
|
||||
withRowAnimation:UITableViewRowAnimationAutomatic];
|
||||
}
|
||||
|
||||
if (self.ppPreviewCell)
|
||||
[self.ppPreviewCell setDownloaderViewHidden:YES animated:NO];
|
||||
else
|
||||
self.isDownloaderViewShown = NO;
|
||||
|
||||
self.actionBar.isAreaNotDownloaded = NO;
|
||||
break;
|
||||
}
|
||||
case NodeStatus::Downloading:
|
||||
{
|
||||
self.ppPreviewCell.mapDownloadProgress.progress = progress;
|
||||
self.actionBar.isAreaNotDownloaded = YES;
|
||||
self.actionBar.downloadingProgress = progress;
|
||||
break;
|
||||
}
|
||||
case NodeStatus::InQueue:
|
||||
{
|
||||
self.ppPreviewCell.mapDownloadProgress.state = MWMCircularProgressStateSpinner;
|
||||
self.actionBar.isAreaNotDownloaded = YES;
|
||||
self.actionBar.downloadingState = MWMCircularProgressStateSpinner;
|
||||
break;
|
||||
}
|
||||
case NodeStatus::Error:
|
||||
{
|
||||
self.ppPreviewCell.mapDownloadProgress.state = MWMCircularProgressStateFailed;
|
||||
self.actionBar.isAreaNotDownloaded = YES;
|
||||
self.actionBar.downloadingState = MWMCircularProgressStateFailed;
|
||||
break;
|
||||
}
|
||||
case NodeStatus::Partly: break;
|
||||
|
@ -334,122 +240,40 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
reloadSections:[NSIndexSet indexSetWithIndex:distance(sections.begin(), it)]
|
||||
withRowAnimation:UITableViewRowAnimationAutomatic];
|
||||
}
|
||||
[self.ppPreviewCell setDownloaderViewHidden:YES animated:NO];
|
||||
self.actionBar.isAreaNotDownloaded = NO;
|
||||
break;
|
||||
}
|
||||
case NodeStatus::NotDownloaded:
|
||||
{
|
||||
self.isPlacePageButtonsEnabled = NO;
|
||||
if (self.ppPreviewCell)
|
||||
[self.ppPreviewCell setDownloaderViewHidden:NO animated:NO];
|
||||
else
|
||||
self.isDownloaderViewShown = YES;
|
||||
|
||||
self.actionBar.isAreaNotDownloaded = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UIScrollViewDelegate
|
||||
#pragma mark - iPad only
|
||||
|
||||
- (void)scrollViewDidScroll:(MWMPPScrollView *)scrollView
|
||||
- (void)updateTopBound
|
||||
{
|
||||
if ([scrollView isEqual:self.placePageView.tableView])
|
||||
return;
|
||||
|
||||
auto const & offset = scrollView.contentOffset;
|
||||
id<MWMPlacePageLayoutDelegate> delegate = self.delegate;
|
||||
if (offset.y <= 0)
|
||||
if (![self.layoutImpl respondsToSelector:@selector(updateLayoutWithTopBound:)])
|
||||
{
|
||||
[self.scrollView removeFromSuperview];
|
||||
[self.actionBar removeFromSuperview];
|
||||
[delegate shouldDestroyLayout];
|
||||
NSAssert(!IPAD, @"iPad layout must implement updateLayoutWithTopBound:!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (offset.y > self.placePageView.height + kLuftDraggingOffset)
|
||||
{
|
||||
auto const bounded = self.placePageView.height + kLuftDraggingOffset;
|
||||
[scrollView setContentOffset:{0, bounded}];
|
||||
[delegate onTopBoundChanged:bounded];
|
||||
}
|
||||
else
|
||||
{
|
||||
[delegate onTopBoundChanged:offset.y];
|
||||
}
|
||||
|
||||
self.direction = self.lastContentOffset < offset.y ? ScrollDirection::Up : ScrollDirection::Down;
|
||||
self.lastContentOffset = offset.y;
|
||||
[self.layoutImpl updateLayoutWithTopBound:self.dataSource.topBound];
|
||||
}
|
||||
|
||||
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
|
||||
withVelocity:(CGPoint)velocity
|
||||
targetContentOffset:(inout CGPoint *)targetContentOffset
|
||||
- (void)updateLeftBound
|
||||
{
|
||||
auto const actualOffset = scrollView.contentOffset.y;
|
||||
auto const openOffset = self.openContentOffset;
|
||||
auto const targetOffset = (*targetContentOffset).y;
|
||||
|
||||
if (actualOffset > self.expandedContentOffset && actualOffset < openOffset)
|
||||
if (![self.layoutImpl respondsToSelector:@selector(updateLayoutWithLeftBound:)])
|
||||
{
|
||||
auto const isDirectionUp = self.direction == ScrollDirection::Up;
|
||||
self.state = isDirectionUp ? State::Top : State::Bottom;
|
||||
(*targetContentOffset).y =
|
||||
isDirectionUp ? openOffset : self.expandedContentOffset;
|
||||
}
|
||||
else if (actualOffset > openOffset && targetOffset < openOffset)
|
||||
{
|
||||
self.state = State::Top;
|
||||
(*targetContentOffset).y = openOffset;
|
||||
}
|
||||
else if (actualOffset < self.expandedContentOffset)
|
||||
{
|
||||
(*targetContentOffset).y = 0;
|
||||
animate(^{
|
||||
self.actionBar.origin = {0., self.ownerView.height};
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
self.state = State::Top;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
|
||||
{
|
||||
if (decelerate)
|
||||
NSAssert(!IPAD, @"iPad layout must implement updateLayoutWithLeftBound:!");
|
||||
return;
|
||||
|
||||
auto const actualOffset = scrollView.contentOffset.y;
|
||||
auto const openOffset = self.openContentOffset;
|
||||
|
||||
if (actualOffset < self.expandedContentOffset + kLuftDraggingOffset)
|
||||
{
|
||||
self.state = State::Bottom;
|
||||
animate(^{
|
||||
[scrollView setContentOffset:{ 0, self.expandedContentOffset } animated:YES];
|
||||
});
|
||||
}
|
||||
else if (actualOffset < openOffset)
|
||||
{
|
||||
auto const isDirectionUp = self.direction == ScrollDirection::Up;
|
||||
self.state = isDirectionUp ? State::Top : State::Bottom;
|
||||
animate(^{
|
||||
[scrollView setContentOffset:{0, isDirectionUp ? openOffset : self.expandedContentOffset}
|
||||
animated:YES];
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
self.state = State::Top;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setState:(State)state
|
||||
{
|
||||
_state = state;
|
||||
self.placePageView.anchorImage.transform = state == State::Top ? CGAffineTransformMakeRotation(M_PI)
|
||||
: CGAffineTransformIdentity;
|
||||
[self.layoutImpl updateLayoutWithLeftBound:self.dataSource.leftBound];
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDelegate & UITableViewDataSource
|
||||
|
@ -469,8 +293,8 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
auto data = self.data;
|
||||
switch (data.sections[section])
|
||||
{
|
||||
case Sections::Preview:
|
||||
case Sections::Bookmark: return 1;
|
||||
case Sections::Preview: return data.previewRows.size();
|
||||
case Sections::Metainfo: return data.metainfoRows.size();
|
||||
case Sections::Buttons: return data.buttonsRows.size();
|
||||
}
|
||||
|
@ -487,29 +311,7 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
{
|
||||
case Sections::Preview:
|
||||
{
|
||||
if (!self.ppPreviewCell)
|
||||
self.ppPreviewCell =
|
||||
[tableView dequeueReusableCellWithIdentifier:[MWMPlacePagePreviewCell className]];
|
||||
|
||||
[self.ppPreviewCell configure:data updateLayoutDelegate:self dataSource:self.dataSource tapAction:^
|
||||
{
|
||||
CGFloat offset = 0;
|
||||
if (self.state == State::Top)
|
||||
{
|
||||
self.state = State::Bottom;
|
||||
offset = self.expandedContentOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.state = State::Top;
|
||||
offset = self.topContentOffset;
|
||||
}
|
||||
animate(^{ [self.scrollView setContentOffset:{0, offset} animated:YES]; });
|
||||
}];
|
||||
|
||||
[self.ppPreviewCell setDownloaderViewHidden:!self.isDownloaderViewShown animated:NO];
|
||||
|
||||
return self.ppPreviewCell;
|
||||
return [self.previewLayoutHelper cellForRowAtIndexPath:indexPath withData:data];
|
||||
}
|
||||
case Sections::Bookmark:
|
||||
{
|
||||
|
@ -523,19 +325,11 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
case Sections::Metainfo:
|
||||
{
|
||||
auto const row = data.metainfoRows[indexPath.row];
|
||||
auto cellName = kMetaInfoCells[static_cast<size_t>(row)];
|
||||
UITableViewCell * c = [tableView dequeueReusableCellWithIdentifier:cellName];
|
||||
|
||||
switch (row)
|
||||
{
|
||||
case MetainfoRows::OpeningHours:
|
||||
{
|
||||
[static_cast<MWMOpeningHoursCell *>(c)
|
||||
configureWithOpeningHours:[data stringForRow:row]
|
||||
updateLayoutDelegate:self
|
||||
isClosedNow:data.schedule == OpeningHours::Closed];
|
||||
break;
|
||||
}
|
||||
case MetainfoRows::ExtendedOpeningHours:
|
||||
return [self.openingHoursLayoutHelper cellForRowAtIndexPath:indexPath];
|
||||
case MetainfoRows::Phone:
|
||||
case MetainfoRows::Address:
|
||||
case MetainfoRows::Website:
|
||||
|
@ -545,11 +339,11 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
case MetainfoRows::Internet:
|
||||
case MetainfoRows::Coordinate:
|
||||
{
|
||||
[static_cast<MWMPlacePageInfoCell *>(c) configWithRow:row data:data];
|
||||
break;
|
||||
MWMPlacePageInfoCell * c = [tableView dequeueReusableCellWithIdentifier:kMetaInfoCells.at(row)];
|
||||
[c configWithRow:row data:data];
|
||||
return c;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
case Sections::Buttons:
|
||||
{
|
||||
|
@ -569,9 +363,9 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
|
||||
#pragma mark - MWMPlacePageCellUpdateProtocol
|
||||
|
||||
- (void)updateCellWithForceReposition:(BOOL)isForceReposition
|
||||
- (void)updateCell
|
||||
{
|
||||
auto const update = isForceReposition ? @selector(updateWithExpand) : @selector(update);
|
||||
auto const update = @selector(update);
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:update object:nil];
|
||||
[self performSelector:update withObject:nil afterDelay:0.1];
|
||||
}
|
||||
|
@ -583,18 +377,18 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
[tableView endUpdates];
|
||||
}
|
||||
|
||||
- (void)updateWithExpand
|
||||
{
|
||||
[self update];
|
||||
[self expand];
|
||||
}
|
||||
|
||||
#pragma mark - MWMPlacePageViewUpdateProtocol
|
||||
|
||||
- (void)updateWithHeight:(CGFloat)height
|
||||
{
|
||||
auto const & size = self.ownerView.size;
|
||||
self.scrollView.contentSize = {size.width, size.height + height};
|
||||
auto const sel = @selector(updatePlacePageHeight);
|
||||
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:sel object:nil];
|
||||
[self performSelector:sel withObject:nil afterDelay:0.1];
|
||||
}
|
||||
|
||||
- (void)updatePlacePageHeight
|
||||
{
|
||||
[self.layoutImpl onUpdatePlacePageWithHeight:self.placePageView.tableView.contentSize.height];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
47
iphone/Maps/Classes/MWMPlacePageLayoutImpl.h
Normal file
47
iphone/Maps/Classes/MWMPlacePageLayoutImpl.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
#import "MWMPlacePageActionBar.h"
|
||||
#import "MWMPPView.h"
|
||||
|
||||
namespace place_page_layout
|
||||
{
|
||||
NSTimeInterval const kAnimationSpeed = IPAD ? 0.15 : 0.25;
|
||||
|
||||
inline void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
||||
{
|
||||
[UIView animateWithDuration:kAnimationSpeed
|
||||
delay:0
|
||||
options:UIViewAnimationOptionCurveEaseIn
|
||||
animations:^{
|
||||
animate();
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
if (completion)
|
||||
completion();
|
||||
}];
|
||||
}
|
||||
} // namepsace place_page_layout
|
||||
|
||||
@protocol MWMPlacePageLayoutDelegate;
|
||||
|
||||
@protocol MWMPlacePageLayoutImpl <NSObject>
|
||||
|
||||
- (instancetype)initOwnerView:(UIView *)ownerView
|
||||
placePageView:(MWMPPView *)placePageView
|
||||
delegate:(id<MWMPlacePageLayoutDelegate>)delegate;
|
||||
- (void)onShow;
|
||||
- (void)onClose;
|
||||
- (void)onScreenResize:(CGSize const &)size;
|
||||
- (void)onUpdatePlacePageWithHeight:(CGFloat)height;
|
||||
- (void)onActionBarInit:(MWMPlacePageActionBar *)actionBar;
|
||||
|
||||
@property(weak, nonatomic) UIView * ownerView;
|
||||
@property(weak, nonatomic) MWMPPView * placePageView;
|
||||
@property(weak, nonatomic) id<MWMPlacePageLayoutDelegate> delegate;
|
||||
@property(weak, nonatomic) MWMPlacePageActionBar * actionBar;
|
||||
|
||||
@optional
|
||||
- (void)onExpandWithPlacePagePreviewHeight:(CGFloat)height;
|
||||
- (void)updateLayoutWithTopBound:(CGFloat)topBound;
|
||||
- (void)updateLayoutWithLeftBound:(CGFloat)leftBound;
|
||||
- (void)setInitialTopBound:(CGFloat)topBound leftBound:(CGFloat)leftBound;
|
||||
|
||||
@end
|
|
@ -47,13 +47,13 @@
|
|||
dataSource:self];
|
||||
}
|
||||
|
||||
[self.layout showWithData:self.data];
|
||||
|
||||
// Call for the first time to produce changes
|
||||
[self processCountryEvent:self.data.countryId];
|
||||
|
||||
[MWMLocationManager addObserver:self];
|
||||
[self.layout setDistanceToObject:self.distanceToObject];
|
||||
|
||||
[self.layout showWithData:self.data];
|
||||
|
||||
// Call for the first time to produce changes
|
||||
[self processCountryEvent:self.data.countryId];
|
||||
}
|
||||
|
||||
- (void)closePlacePage
|
||||
|
@ -134,7 +134,7 @@
|
|||
|
||||
#pragma mark - MWMPlacePageLayout
|
||||
|
||||
- (void)onTopBoundChanged:(CGFloat)bound
|
||||
- (void)onPlacePageTopBoundChanged:(CGFloat)bound
|
||||
{
|
||||
[[MWMMapViewControlsManager manager]
|
||||
dragPlacePage:{{0, self.ownerViewController.view.height - bound}, {}}];
|
||||
|
@ -307,15 +307,34 @@
|
|||
#pragma mark - MWMFeatureHolder
|
||||
|
||||
- (FeatureID const &)featureId { return self.data.featureId; }
|
||||
|
||||
#pragma mark - Owner
|
||||
|
||||
- (MapViewController *)ownerViewController { return [MapViewController controller]; }
|
||||
|
||||
#pragma mark - Deprecated
|
||||
|
||||
@synthesize leftBound = _leftBound;
|
||||
@synthesize topBound = _topBound;
|
||||
- (void)setTopBound:(CGFloat)topBound { _topBound = 0; }
|
||||
- (void)setLeftBound:(CGFloat)leftBound { _leftBound = 0; }
|
||||
|
||||
- (void)setTopBound:(CGFloat)topBound
|
||||
{
|
||||
if (topBound == _topBound)
|
||||
return;
|
||||
|
||||
_topBound = topBound;
|
||||
[self.layout updateTopBound];
|
||||
}
|
||||
|
||||
- (void)setLeftBound:(CGFloat)leftBound
|
||||
{
|
||||
if (_leftBound == leftBound)
|
||||
return;
|
||||
|
||||
_leftBound = leftBound;
|
||||
[self.layout updateLeftBound];
|
||||
}
|
||||
|
||||
- (void)addSubviews:(NSArray *)views withNavigationController:(UINavigationController *)controller
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
#import "MWMTableViewCell.h"
|
||||
|
||||
@class MWMPlacePageData;
|
||||
@class MWMCircularProgress;
|
||||
|
||||
@protocol MWMPlacePageCellUpdateProtocol;
|
||||
@protocol MWMPlacePageLayoutDataSource;
|
||||
|
||||
@interface MWMPlacePagePreviewCell : MWMTableViewCell
|
||||
|
||||
- (void)setDistanceToObject:(NSString *)distance;
|
||||
- (void)rotateDirectionArrowToAngle:(CGFloat)angle;
|
||||
|
||||
- (void)setDownloaderViewHidden:(BOOL)isHidden animated:(BOOL)isAnimated;
|
||||
- (void)setDownloadingProgress:(CGFloat)progress;
|
||||
|
||||
- (void)configure:(MWMPlacePageData *)data
|
||||
updateLayoutDelegate:(id<MWMPlacePageCellUpdateProtocol>)delegate
|
||||
dataSource:(id<MWMPlacePageLayoutDataSource>)dataSource
|
||||
tapAction:(TMWMVoidBlock)tapAction;
|
||||
|
||||
- (MWMCircularProgress *)mapDownloadProgress;
|
||||
|
||||
@end
|
|
@ -1,440 +0,0 @@
|
|||
#import "MWMPlacePagePreviewCell.h"
|
||||
#import "Common.h"
|
||||
#import "MWMCircularProgress.h"
|
||||
#import "MWMDirectionView.h"
|
||||
#import "MWMPlacePageCellUpdateProtocol.h"
|
||||
#import "MWMPlacePageData.h"
|
||||
#import "MWMPlacePageLayout.h"
|
||||
#import "UIColor+MapsmeColor.h"
|
||||
|
||||
#include "std/array.hpp"
|
||||
#include "std/vector.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
array<NSString *, 6> kPPPClasses = {{@"_MWMPPPTitle", @"_MWMPPPExternalTitle", @"_MWMPPPSubtitle",
|
||||
@"_MWMPPPSchedule", @"_MWMPPPBooking", @"_MWMPPPAddress"}};
|
||||
|
||||
enum class Labels
|
||||
{
|
||||
Title,
|
||||
ExternalTitle,
|
||||
Subtitle,
|
||||
Schedule,
|
||||
Booking,
|
||||
Address
|
||||
};
|
||||
|
||||
void * kContext = &kContext;
|
||||
NSString * const kTableViewContentSizeKeyPath = @"contentSize";
|
||||
CGFloat const kDefaultTableViewLeading = 16;
|
||||
CGFloat const kCompressedTableViewLeading = 56;
|
||||
|
||||
} // namespace
|
||||
|
||||
#pragma mark - Base
|
||||
|
||||
// Base class for avoiding copy-paste in inheriting cells.
|
||||
@interface _MWMPPPCellBase : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * distance;
|
||||
@property(weak, nonatomic) IBOutlet UIImageView * compass;
|
||||
@property(weak, nonatomic) IBOutlet UIView * distanceView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * trailing;
|
||||
@property(copy, nonatomic) TMWMVoidBlock tapOnDistance;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPCellBase
|
||||
|
||||
- (IBAction)tap
|
||||
{
|
||||
if (self.tapOnDistance)
|
||||
self.tapOnDistance();
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - Title
|
||||
|
||||
@interface _MWMPPPTitle : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * title;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPTitle
|
||||
@end
|
||||
|
||||
#pragma mark - External Title
|
||||
|
||||
@interface _MWMPPPExternalTitle : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * externalTitle;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPExternalTitle
|
||||
@end
|
||||
|
||||
#pragma mark - Subtitle
|
||||
|
||||
@interface _MWMPPPSubtitle : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * subtitle;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPSubtitle
|
||||
@end
|
||||
|
||||
#pragma mark - Schedule
|
||||
|
||||
@interface _MWMPPPSchedule : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * schedule;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPSchedule
|
||||
@end
|
||||
|
||||
#pragma mark - Booking
|
||||
|
||||
@interface _MWMPPPBooking : MWMTableViewCell
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * rating;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * pricing;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPBooking
|
||||
@end
|
||||
|
||||
#pragma mark - Address
|
||||
|
||||
@interface _MWMPPPAddress : _MWMPPPCellBase
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * address;
|
||||
|
||||
@end
|
||||
|
||||
@implementation _MWMPPPAddress
|
||||
@end
|
||||
|
||||
#pragma mark - Public
|
||||
|
||||
@interface MWMPlacePagePreviewCell ()<UITableViewDelegate, UITableViewDataSource,
|
||||
MWMCircularProgressProtocol>
|
||||
{
|
||||
vector<Labels> m_cells;
|
||||
}
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UITableView * tableView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * tableViewHeight;
|
||||
@property(weak, nonatomic) NSLayoutConstraint * trailing;
|
||||
@property(weak, nonatomic) UIView * distanceView;
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIView * downloaderParentView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * tableViewLeading;
|
||||
|
||||
@property(nonatomic) MWMCircularProgress * mapDownloadProgress;
|
||||
|
||||
@property(nonatomic) BOOL isDirectionViewAvailable;
|
||||
|
||||
@property(weak, nonatomic) MWMPlacePageData * data;
|
||||
@property(weak, nonatomic) id<MWMPlacePageCellUpdateProtocol> delegate;
|
||||
@property(weak, nonatomic) id<MWMPlacePageLayoutDataSource> dataSource;
|
||||
|
||||
@property(copy, nonatomic) NSString * distance;
|
||||
@property(weak, nonatomic) UIImageView * compass;
|
||||
@property(nonatomic) CGFloat currentContentHeight;
|
||||
|
||||
@property(nonatomic) MWMDirectionView * directionView;
|
||||
|
||||
@property(copy, nonatomic) TMWMVoidBlock tapAction;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMPlacePagePreviewCell
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
[super awakeFromNib];
|
||||
for (auto const s : kPPPClasses)
|
||||
[self.tableView registerNib:[UINib nibWithNibName:s bundle:nil] forCellReuseIdentifier:s];
|
||||
|
||||
self.tableView.estimatedRowHeight = 20;
|
||||
self.tableView.rowHeight = UITableViewAutomaticDimension;
|
||||
[self registerObserver];
|
||||
|
||||
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
|
||||
[self addGestureRecognizer:tap];
|
||||
}
|
||||
|
||||
- (void)dealloc { [self unregisterObserver]; }
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object
|
||||
change:(NSDictionary *)change
|
||||
context:(void *)context
|
||||
{
|
||||
if (context == kContext)
|
||||
{
|
||||
NSValue * s = change[@"new"];
|
||||
CGFloat const height = s.CGSizeValue.height;
|
||||
if (!equalScreenDimensions(height, self.currentContentHeight))
|
||||
{
|
||||
self.currentContentHeight = height;
|
||||
self.tableViewHeight.constant = height;
|
||||
[self setNeedsLayout];
|
||||
[self.delegate updateCellWithForceReposition:YES];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
||||
}
|
||||
|
||||
- (MWMDirectionView *)directionView
|
||||
{
|
||||
if (!_directionView)
|
||||
_directionView = [[MWMDirectionView alloc] initWithManager:nil];
|
||||
return _directionView;
|
||||
}
|
||||
|
||||
- (void)setIsDirectionViewAvailable:(BOOL)isDirectionViewAvailable
|
||||
{
|
||||
if (_isDirectionViewAvailable == isDirectionViewAvailable)
|
||||
return;
|
||||
_isDirectionViewAvailable = isDirectionViewAvailable;
|
||||
[self setNeedsLayout];
|
||||
}
|
||||
|
||||
- (void)rotateDirectionArrowToAngle:(CGFloat)angle
|
||||
{
|
||||
auto const t = CATransform3DMakeRotation(M_PI_2 - angle, 0, 0, 1);
|
||||
self.compass.layer.transform = t;
|
||||
self.directionView.directionArrow.layer.transform = t;
|
||||
}
|
||||
|
||||
- (void)setDistanceToObject:(NSString *)distance
|
||||
{
|
||||
if (!distance.length)
|
||||
{
|
||||
self.isDirectionViewAvailable = NO;
|
||||
[self setNeedsLayout];
|
||||
return;
|
||||
}
|
||||
|
||||
if ([self.distance isEqualToString:distance])
|
||||
return;
|
||||
|
||||
self.distance = distance;
|
||||
self.directionView.distanceLabel.text = distance;
|
||||
self.isDirectionViewAvailable = YES;
|
||||
}
|
||||
|
||||
- (void)unregisterObserver
|
||||
{
|
||||
[self.tableView removeObserver:self forKeyPath:kTableViewContentSizeKeyPath context:kContext];
|
||||
}
|
||||
|
||||
- (void)registerObserver
|
||||
{
|
||||
[self.tableView addObserver:self
|
||||
forKeyPath:kTableViewContentSizeKeyPath
|
||||
options:NSKeyValueObservingOptionNew
|
||||
context:kContext];
|
||||
}
|
||||
|
||||
- (void)setDownloadingProgress:(CGFloat)progress { self.mapDownloadProgress.progress = progress; }
|
||||
- (void)setDownloaderViewHidden:(BOOL)isHidden animated:(BOOL)isAnimated
|
||||
{
|
||||
self.downloaderParentView.hidden = isHidden;
|
||||
self.tableViewLeading.constant =
|
||||
isHidden ? kDefaultTableViewLeading : kCompressedTableViewLeading;
|
||||
[self setNeedsLayout];
|
||||
|
||||
if (!isHidden)
|
||||
self.mapDownloadProgress.state = MWMCircularProgressStateNormal;
|
||||
|
||||
if (!isAnimated)
|
||||
return;
|
||||
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
[self layoutIfNeeded];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)configure:(MWMPlacePageData *)data
|
||||
updateLayoutDelegate:(id<MWMPlacePageCellUpdateProtocol>)delegate
|
||||
dataSource:(id<MWMPlacePageLayoutDataSource>)dataSource
|
||||
tapAction:(TMWMVoidBlock)tapAction
|
||||
{
|
||||
self.data = data;
|
||||
self.delegate = delegate;
|
||||
self.dataSource = dataSource;
|
||||
[self setDistanceToObject:dataSource.distanceToObject];
|
||||
|
||||
m_cells.clear();
|
||||
|
||||
if (data.title.length)
|
||||
m_cells.push_back(Labels::Title);
|
||||
|
||||
if (data.externalTitle.length)
|
||||
m_cells.push_back(Labels::ExternalTitle);
|
||||
|
||||
if (data.subtitle.length)
|
||||
m_cells.push_back(Labels::Subtitle);
|
||||
|
||||
if (data.schedule != place_page::OpeningHours::Unknown)
|
||||
m_cells.push_back(Labels::Schedule);
|
||||
|
||||
if (data.bookingRating.length)
|
||||
m_cells.push_back(Labels::Booking);
|
||||
|
||||
if (data.address.length)
|
||||
m_cells.push_back(Labels::Address);
|
||||
|
||||
[self.tableView reloadData];
|
||||
|
||||
NSAssert(tapAction, @"Cell must be tappable!");
|
||||
self.tapAction = tapAction;
|
||||
}
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
return m_cells.size();
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView
|
||||
cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
auto data = self.data;
|
||||
_MWMPPPCellBase * c = nil;
|
||||
BOOL const isNeedToShowDistance =
|
||||
self.isDirectionViewAvailable && (indexPath.row == m_cells.size() - 1);
|
||||
|
||||
switch (m_cells[indexPath.row])
|
||||
{
|
||||
case Labels::Title:
|
||||
{
|
||||
c = [tableView dequeueReusableCellWithIdentifier:[_MWMPPPTitle className]];
|
||||
static_cast<_MWMPPPTitle *>(c).title.text = data.title;
|
||||
break;
|
||||
}
|
||||
case Labels::ExternalTitle:
|
||||
{
|
||||
c = [tableView dequeueReusableCellWithIdentifier:[_MWMPPPExternalTitle className]];
|
||||
static_cast<_MWMPPPExternalTitle *>(c).externalTitle.text = data.externalTitle;
|
||||
break;
|
||||
}
|
||||
case Labels::Subtitle:
|
||||
{
|
||||
c = [tableView dequeueReusableCellWithIdentifier:[_MWMPPPSubtitle className]];
|
||||
static_cast<_MWMPPPSubtitle *>(c).subtitle.text = data.subtitle;
|
||||
break;
|
||||
}
|
||||
case Labels::Schedule:
|
||||
{
|
||||
c = [tableView dequeueReusableCellWithIdentifier:[_MWMPPPSchedule className]];
|
||||
auto castedCell = static_cast<_MWMPPPSchedule *>(c);
|
||||
switch (data.schedule)
|
||||
{
|
||||
case place_page::OpeningHours::AllDay:
|
||||
castedCell.schedule.text = L(@"twentyfour_seven");
|
||||
castedCell.schedule.textColor = [UIColor blackSecondaryText];
|
||||
break;
|
||||
case place_page::OpeningHours::Open:
|
||||
castedCell.schedule.text = L(@"editor_time_open");
|
||||
castedCell.schedule.textColor = [UIColor blackSecondaryText];
|
||||
break;
|
||||
case place_page::OpeningHours::Closed:
|
||||
castedCell.schedule.text = L(@"closed_now");
|
||||
castedCell.schedule.textColor = [UIColor red];
|
||||
break;
|
||||
case place_page::OpeningHours::Unknown: NSAssert(false, @"Incorrect schedule!"); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Labels::Booking:
|
||||
{
|
||||
_MWMPPPBooking * c = [tableView dequeueReusableCellWithIdentifier:[_MWMPPPBooking className]];
|
||||
c.rating.text = data.bookingRating;
|
||||
c.pricing.text = data.bookingApproximatePricing;
|
||||
[data assignOnlinePriceToLabel:c.pricing];
|
||||
return c;
|
||||
}
|
||||
case Labels::Address:
|
||||
{
|
||||
c = [tableView dequeueReusableCellWithIdentifier:[_MWMPPPAddress className]];
|
||||
static_cast<_MWMPPPAddress *>(c).address.text = data.address;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isNeedToShowDistance)
|
||||
[self showDistanceOnCell:c];
|
||||
else
|
||||
[self hideDistanceOnCell:c];
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
- (void)showDistanceOnCell:(_MWMPPPCellBase *)cell
|
||||
{
|
||||
cell.trailing.priority = UILayoutPriorityDefaultLow;
|
||||
cell.distance.text = self.distance;
|
||||
cell.tapOnDistance = ^{
|
||||
[self.directionView show];
|
||||
};
|
||||
[cell.contentView setNeedsLayout];
|
||||
self.compass = cell.compass;
|
||||
self.trailing = cell.trailing;
|
||||
self.distanceView = cell.distanceView;
|
||||
cell.distanceView.hidden = NO;
|
||||
}
|
||||
|
||||
- (void)hideDistanceOnCell:(_MWMPPPCellBase *)cell
|
||||
{
|
||||
cell.trailing.priority = UILayoutPriorityDefaultHigh;
|
||||
[cell.contentView setNeedsLayout];
|
||||
cell.distanceView.hidden = YES;
|
||||
}
|
||||
|
||||
#pragma mark - MWMCircularProgressProtocol
|
||||
|
||||
- (void)progressButtonPressed:(MWMCircularProgress *)progress
|
||||
{
|
||||
[self.dataSource downloadSelectedArea];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (MWMCircularProgress *)mapDownloadProgress
|
||||
{
|
||||
if (!_mapDownloadProgress)
|
||||
{
|
||||
_mapDownloadProgress =
|
||||
[MWMCircularProgress downloaderProgressForParentView:self.downloaderParentView];
|
||||
_mapDownloadProgress.delegate = self;
|
||||
|
||||
MWMCircularProgressStateVec const affectedStates = {MWMCircularProgressStateNormal,
|
||||
MWMCircularProgressStateSelected};
|
||||
|
||||
[_mapDownloadProgress setImageName:@"ic_download" forStates:affectedStates];
|
||||
[_mapDownloadProgress setColoring:MWMButtonColoringBlue forStates:affectedStates];
|
||||
}
|
||||
return _mapDownloadProgress;
|
||||
}
|
||||
|
||||
#pragma mark - Tap
|
||||
|
||||
- (void)tap
|
||||
{
|
||||
if (self.tapAction)
|
||||
self.tapAction();
|
||||
}
|
||||
|
||||
@end
|
|
@ -18,6 +18,7 @@
|
|||
- (void)book:(BOOL)isDecription;
|
||||
|
||||
- (void)apiBack;
|
||||
- (void)downloadSelectedArea;
|
||||
|
||||
@end
|
||||
|
||||
|
|
5
iphone/Maps/Classes/MWMiPadPlacePageLayoutImpl.h
Normal file
5
iphone/Maps/Classes/MWMiPadPlacePageLayoutImpl.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#import "MWMPlacePageLayoutImpl.h"
|
||||
|
||||
@interface MWMiPadPlacePageLayoutImpl : NSObject <MWMPlacePageLayoutImpl>
|
||||
|
||||
@end
|
221
iphone/Maps/Classes/MWMiPadPlacePageLayoutImpl.mm
Normal file
221
iphone/Maps/Classes/MWMiPadPlacePageLayoutImpl.mm
Normal file
|
@ -0,0 +1,221 @@
|
|||
#import "MWMPlacePageLayout.h"
|
||||
#import "MWMiPadPlacePageLayoutImpl.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
CGFloat const kPlacePageWidth = 360;
|
||||
CGFloat const kLeftOffset = 12.;
|
||||
CGFloat const kTopOffset = 36.;
|
||||
CGFloat const kBottomOffset = 60.;
|
||||
} // namespace
|
||||
|
||||
@interface MWMPPView (ActionBarLayout)
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMPPView (ActionBarLayout)
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
if (!IPAD)
|
||||
{
|
||||
[super layoutSubviews];
|
||||
return;
|
||||
}
|
||||
|
||||
for (UIView * sv in self.subviews)
|
||||
{
|
||||
if (![sv isKindOfClass:[MWMPlacePageActionBar class]])
|
||||
continue;
|
||||
sv.maxY = self.height;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface MWMiPadPlacePageLayoutImpl ()
|
||||
|
||||
@property(nonatomic) CGFloat topBound;
|
||||
@property(nonatomic) CGFloat leftBound;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMiPadPlacePageLayoutImpl
|
||||
|
||||
@synthesize ownerView = _ownerView;
|
||||
@synthesize placePageView = _placePageView;
|
||||
@synthesize delegate = _delegate;
|
||||
@synthesize actionBar = _actionBar;
|
||||
|
||||
- (instancetype)initOwnerView:(UIView *)ownerView
|
||||
placePageView:(MWMPPView *)placePageView
|
||||
delegate:(id<MWMPlacePageLayoutDelegate>)delegate
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
_ownerView = ownerView;
|
||||
_placePageView = placePageView;
|
||||
_delegate = delegate;
|
||||
placePageView.width = kPlacePageWidth;
|
||||
placePageView.anchorImage.hidden = YES;
|
||||
[self addShadow];
|
||||
auto pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPan:)];
|
||||
[placePageView addGestureRecognizer:pan];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)addShadow
|
||||
{
|
||||
CALayer * layer = self.placePageView.layer;
|
||||
layer.masksToBounds = NO;
|
||||
layer.shadowColor = UIColor.blackColor.CGColor;
|
||||
layer.shadowRadius = 4.;
|
||||
layer.shadowOpacity = 0.24f;
|
||||
layer.shadowOffset = {0, -2};
|
||||
layer.shouldRasterize = YES;
|
||||
layer.rasterizationScale = [[UIScreen mainScreen] scale];
|
||||
}
|
||||
|
||||
- (void)onShow
|
||||
{
|
||||
auto ppView = self.placePageView;
|
||||
auto actionBar = self.actionBar;
|
||||
ppView.tableView.scrollEnabled = NO;
|
||||
actionBar.alpha = 0;
|
||||
ppView.alpha = 0;
|
||||
ppView.origin = {-self.leftBound - kPlacePageWidth, self.topBound};
|
||||
[self.ownerView addSubview:ppView];
|
||||
|
||||
place_page_layout::animate(^{
|
||||
ppView.alpha = 1;
|
||||
actionBar.alpha = 1;
|
||||
ppView.minX = self.leftBound;
|
||||
});
|
||||
}
|
||||
|
||||
- (void)onClose
|
||||
{
|
||||
auto ppView = self.placePageView;
|
||||
place_page_layout::animate(^{
|
||||
ppView.maxX = -self.leftBound;
|
||||
ppView.alpha = 0;
|
||||
},^{
|
||||
[self.placePageView removeFromSuperview];
|
||||
[self.actionBar removeFromSuperview];
|
||||
self.actionBar = nil;
|
||||
[self.delegate shouldDestroyLayout];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)onScreenResize:(CGSize const &)size
|
||||
{
|
||||
[self layoutPlacePage:self.placePageView.tableView.contentSize.height onScreen:size.height];
|
||||
}
|
||||
|
||||
- (void)onUpdatePlacePageWithHeight:(CGFloat)height
|
||||
{
|
||||
[self layoutPlacePage:height onScreen:self.ownerView.height];
|
||||
}
|
||||
|
||||
- (void)onActionBarInit:(MWMPlacePageActionBar *)actionBar
|
||||
{
|
||||
UIView * superview = self.placePageView;
|
||||
self.actionBar = actionBar;
|
||||
[superview addSubview:actionBar];
|
||||
actionBar.origin = {0., superview.height - actionBar.height};
|
||||
}
|
||||
|
||||
- (void)setInitialTopBound:(CGFloat)topBound leftBound:(CGFloat)leftBound
|
||||
{
|
||||
self.topBound = topBound;
|
||||
self.leftBound = leftBound;
|
||||
}
|
||||
|
||||
- (void)updateLayoutWithTopBound:(CGFloat)topBound
|
||||
{
|
||||
self.topBound = topBound;
|
||||
[self layoutPlacePage:self.placePageView.tableView.contentSize.height onScreen:self.ownerView.height];
|
||||
}
|
||||
|
||||
- (void)updateLayoutWithLeftBound:(CGFloat)leftBound
|
||||
{
|
||||
self.leftBound = leftBound;
|
||||
place_page_layout::animate(^{
|
||||
self.placePageView.minX = self.leftBound;
|
||||
});
|
||||
}
|
||||
|
||||
- (void)layoutPlacePage:(CGFloat)placePageHeight onScreen:(CGFloat)screenHeight
|
||||
{
|
||||
BOOL const isPlacePageWithinScreen = [self isPlacePage:placePageHeight withinScreen:screenHeight];
|
||||
auto ppView = self.placePageView;
|
||||
|
||||
place_page_layout::animate(^{
|
||||
ppView.minY = self.topBound;
|
||||
});
|
||||
|
||||
ppView.height = [self actualPlacePageViewHeightWithPlacePageHeight:placePageHeight
|
||||
screenHeight:screenHeight];
|
||||
|
||||
if (!ppView.tableView.scrollEnabled && !isPlacePageWithinScreen)
|
||||
ppView.tableView.scrollEnabled = YES;
|
||||
}
|
||||
|
||||
- (CGFloat)actualPlacePageViewHeightWithPlacePageHeight:(CGFloat)placePageHeight
|
||||
screenHeight:(CGFloat)screenHeight
|
||||
{
|
||||
auto ppView = self.placePageView;
|
||||
if ([self isPlacePage:placePageHeight withinScreen:screenHeight])
|
||||
return placePageHeight + ppView.top.height;
|
||||
|
||||
return screenHeight - kBottomOffset - self.topBound + (ppView.tableView.scrollEnabled ?
|
||||
self.actionBar.height : 0);
|
||||
}
|
||||
|
||||
- (BOOL)isPlacePage:(CGFloat)placePageHeight withinScreen:(CGFloat)screenHeight
|
||||
{
|
||||
auto const placePageFullHeight = placePageHeight;
|
||||
auto const availableSpace = screenHeight - self.topBound - kBottomOffset;
|
||||
return availableSpace > placePageFullHeight;
|
||||
}
|
||||
|
||||
#pragma mark - Pan
|
||||
|
||||
- (void)didPan:(UIPanGestureRecognizer *)pan
|
||||
{
|
||||
MWMPPView * view = self.placePageView;
|
||||
UIView * superview = view.superview;
|
||||
|
||||
CGFloat const leftOffset = self.leftBound;
|
||||
view.minX += [pan translationInView:superview].x;
|
||||
view.minX = MIN(view.minX, leftOffset);
|
||||
[pan setTranslation:CGPointZero inView:superview];
|
||||
|
||||
CGFloat const alpha = MAX(0.0, view.maxX) / (view.width + leftOffset);
|
||||
view.alpha = alpha;
|
||||
UIGestureRecognizerState const state = pan.state;
|
||||
if (state == UIGestureRecognizerStateEnded || state == UIGestureRecognizerStateCancelled)
|
||||
{
|
||||
if (alpha < 0.8)
|
||||
{
|
||||
[self onClose];
|
||||
}
|
||||
else
|
||||
{
|
||||
place_page_layout::animate(^{
|
||||
view.minX = leftOffset;
|
||||
view.alpha = 1;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Top and left bound
|
||||
|
||||
- (CGFloat)topBound { return _topBound + kTopOffset; }
|
||||
- (CGFloat)leftBound { return _leftBound + kLeftOffset; }
|
||||
|
||||
@end
|
5
iphone/Maps/Classes/MWMiPhonePlacePageLayoutImpl.h
Normal file
5
iphone/Maps/Classes/MWMiPhonePlacePageLayoutImpl.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#import "MWMPlacePageLayoutImpl.h"
|
||||
|
||||
@interface MWMiPhonePlacePageLayoutImpl : NSObject<MWMPlacePageLayoutImpl>
|
||||
|
||||
@end
|
286
iphone/Maps/Classes/MWMiPhonePlacePageLayoutImpl.mm
Normal file
286
iphone/Maps/Classes/MWMiPhonePlacePageLayoutImpl.mm
Normal file
|
@ -0,0 +1,286 @@
|
|||
#import "MWMPlacePageLayout.h"
|
||||
#import "MWMiPhonePlacePageLayoutImpl.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
enum class ScrollDirection
|
||||
{
|
||||
Up,
|
||||
Down
|
||||
};
|
||||
|
||||
enum class State
|
||||
{
|
||||
Bottom,
|
||||
Top
|
||||
};
|
||||
|
||||
// Minimal offset for collapse. If place page offset is below this value we should hide place page.
|
||||
CGFloat const kMinOffset = 1;
|
||||
CGFloat const kOpenPlacePageStopValue = 0.7;
|
||||
CGFloat const kLuftDraggingOffset = 30;
|
||||
} // namespace
|
||||
|
||||
@interface MWMiPhonePlacePageLayoutImpl () <UIScrollViewDelegate, UITableViewDelegate>
|
||||
|
||||
@property(nonatomic) MWMPPScrollView * scrollView;
|
||||
@property(nonatomic) ScrollDirection direction;
|
||||
@property(nonatomic) State state;
|
||||
|
||||
@property(nonatomic) CGFloat portraitOpenContentOffset;
|
||||
@property(nonatomic) CGFloat landscapeOpenContentOffset;
|
||||
@property(nonatomic) CGFloat lastContentOffset;
|
||||
@property(nonatomic) CGFloat expandedContentOffset;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMiPhonePlacePageLayoutImpl
|
||||
|
||||
@synthesize ownerView = _ownerView;
|
||||
@synthesize placePageView = _placePageView;
|
||||
@synthesize delegate = _delegate;
|
||||
@synthesize actionBar = _actionBar;
|
||||
|
||||
- (instancetype)initOwnerView:(UIView *)ownerView
|
||||
placePageView:(MWMPPView *)placePageView
|
||||
delegate:(id<MWMPlacePageLayoutDelegate>)delegate
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
auto const & size = ownerView.size;
|
||||
_ownerView = ownerView;
|
||||
_placePageView = placePageView;
|
||||
placePageView.tableView.delegate = self;
|
||||
_delegate = delegate;
|
||||
_scrollView = [[MWMPPScrollView alloc] initWithFrame:ownerView.frame inactiveView:placePageView];
|
||||
_scrollView.delegate = self;
|
||||
_portraitOpenContentOffset = MAX(size.width, size.height) * kOpenPlacePageStopValue;
|
||||
_landscapeOpenContentOffset = MIN(size.width, size.height) * kOpenPlacePageStopValue;
|
||||
placePageView.frame = {{0, size.height}, size};
|
||||
[ownerView addSubview:self.scrollView];
|
||||
[_scrollView addSubview:placePageView];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)onShow
|
||||
{
|
||||
self.state = State::Bottom;
|
||||
[self colapse];
|
||||
}
|
||||
|
||||
- (void)onClose
|
||||
{
|
||||
place_page_layout::animate(^{
|
||||
self.actionBar.origin = {0., self.ownerView.height};
|
||||
[self.scrollView setContentOffset:{} animated:YES];
|
||||
},^{
|
||||
[self.actionBar removeFromSuperview];
|
||||
self.actionBar = nil;
|
||||
[self.delegate shouldDestroyLayout];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)onScreenResize:(CGSize const &)size
|
||||
{
|
||||
self.scrollView.frame = {{}, size};
|
||||
self.placePageView.origin = {0., size.height};
|
||||
auto actionBar = self.actionBar;
|
||||
actionBar.frame = {{0., size.height - actionBar.height},
|
||||
{size.width, actionBar.height}};
|
||||
[self.delegate onPlacePageTopBoundChanged:self.scrollView.contentOffset.y];
|
||||
}
|
||||
|
||||
- (void)onUpdatePlacePageWithHeight:(CGFloat)height
|
||||
{
|
||||
auto const & size = self.ownerView.size;
|
||||
self.scrollView.contentSize = {size.width, size.height + self.placePageView.height};
|
||||
}
|
||||
|
||||
- (void)onActionBarInit:(MWMPlacePageActionBar *)actionBar
|
||||
{
|
||||
UIView * superview = self.ownerView;
|
||||
self.actionBar = actionBar;
|
||||
actionBar.origin = {0., superview.height};
|
||||
[superview addSubview:_actionBar];
|
||||
}
|
||||
|
||||
- (void)onExpandWithPlacePagePreviewHeight:(CGFloat)height
|
||||
{
|
||||
self.actionBar.hidden = NO;
|
||||
self.scrollView.scrollEnabled = YES;
|
||||
|
||||
place_page_layout::animate(^{
|
||||
auto ppView = self.placePageView;
|
||||
[ppView hideTableView:NO];
|
||||
auto actionBar = self.actionBar;
|
||||
actionBar.minY = actionBar.superview.height - actionBar.height;
|
||||
|
||||
// We decrease expanded offset for 2 pixels because it looks more clear.
|
||||
auto constexpr designOffset = 2;
|
||||
self.expandedContentOffset = height + actionBar.height - designOffset;
|
||||
|
||||
auto const targetOffset =
|
||||
self.state == State::Bottom ? self.expandedContentOffset : self.topContentOffset;
|
||||
[self.scrollView setContentOffset:{ 0, targetOffset } animated:YES];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)colapse
|
||||
{
|
||||
self.scrollView.scrollEnabled = NO;
|
||||
[self.placePageView hideTableView:YES];
|
||||
|
||||
place_page_layout::animate(^{
|
||||
[self.scrollView setContentOffset:{ 0., kMinOffset } animated:YES];
|
||||
});
|
||||
}
|
||||
|
||||
#pragma mark - UIScrollViewDelegate
|
||||
|
||||
- (BOOL)isPortrait
|
||||
{
|
||||
auto const & s = self.ownerView.size;
|
||||
return s.height > s.width;
|
||||
}
|
||||
|
||||
- (CGFloat)openContentOffset
|
||||
{
|
||||
return self.isPortrait ? self.portraitOpenContentOffset : self.landscapeOpenContentOffset;
|
||||
}
|
||||
|
||||
- (CGFloat)topContentOffset
|
||||
{
|
||||
auto const target = self.openContentOffset;
|
||||
auto const ppView = self.placePageView;
|
||||
if (target > ppView.height)
|
||||
return ppView.height;
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
- (void)scrollViewDidScroll:(MWMPPScrollView *)scrollView
|
||||
{
|
||||
auto ppView = self.placePageView;
|
||||
if ([scrollView isEqual:ppView.tableView])
|
||||
return;
|
||||
|
||||
auto const & offset = scrollView.contentOffset;
|
||||
id<MWMPlacePageLayoutDelegate> delegate = self.delegate;
|
||||
if (offset.y <= 0)
|
||||
{
|
||||
[self.scrollView removeFromSuperview];
|
||||
[self.actionBar removeFromSuperview];
|
||||
[delegate shouldDestroyLayout];
|
||||
return;
|
||||
}
|
||||
|
||||
if (offset.y > ppView.height + kLuftDraggingOffset)
|
||||
{
|
||||
auto const bounded = ppView.height + kLuftDraggingOffset;
|
||||
[scrollView setContentOffset:{0, bounded}];
|
||||
[delegate onPlacePageTopBoundChanged:bounded];
|
||||
}
|
||||
else
|
||||
{
|
||||
[delegate onPlacePageTopBoundChanged:offset.y];
|
||||
}
|
||||
|
||||
self.direction = self.lastContentOffset < offset.y ? ScrollDirection::Up : ScrollDirection::Down;
|
||||
self.lastContentOffset = offset.y;
|
||||
}
|
||||
|
||||
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
|
||||
withVelocity:(CGPoint)velocity
|
||||
targetContentOffset:(inout CGPoint *)targetContentOffset
|
||||
{
|
||||
auto const actualOffset = scrollView.contentOffset.y;
|
||||
auto const openOffset = self.openContentOffset;
|
||||
auto const targetOffset = (*targetContentOffset).y;
|
||||
|
||||
if (actualOffset > self.expandedContentOffset && actualOffset < openOffset)
|
||||
{
|
||||
auto const isDirectionUp = self.direction == ScrollDirection::Up;
|
||||
self.state = isDirectionUp ? State::Top : State::Bottom;
|
||||
(*targetContentOffset).y =
|
||||
isDirectionUp ? openOffset : self.expandedContentOffset;
|
||||
}
|
||||
else if (actualOffset > openOffset && targetOffset < openOffset)
|
||||
{
|
||||
self.state = State::Top;
|
||||
(*targetContentOffset).y = openOffset;
|
||||
}
|
||||
else if (actualOffset < self.expandedContentOffset)
|
||||
{
|
||||
(*targetContentOffset).y = 0;
|
||||
place_page_layout::animate(^{
|
||||
self.actionBar.origin = {0., self.ownerView.height};
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
self.state = State::Top;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
|
||||
{
|
||||
if (decelerate)
|
||||
return;
|
||||
|
||||
auto const actualOffset = scrollView.contentOffset.y;
|
||||
auto const openOffset = self.openContentOffset;
|
||||
|
||||
if (actualOffset < self.expandedContentOffset + kLuftDraggingOffset)
|
||||
{
|
||||
self.state = State::Bottom;
|
||||
place_page_layout::animate(^{
|
||||
[scrollView setContentOffset:{ 0, self.expandedContentOffset } animated:YES];
|
||||
});
|
||||
}
|
||||
else if (actualOffset < openOffset)
|
||||
{
|
||||
auto const isDirectionUp = self.direction == ScrollDirection::Up;
|
||||
self.state = isDirectionUp ? State::Top : State::Bottom;
|
||||
place_page_layout::animate(^{
|
||||
[scrollView setContentOffset:{0, isDirectionUp ? openOffset : self.expandedContentOffset}
|
||||
animated:YES];
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
self.state = State::Top;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setState:(State)state
|
||||
{
|
||||
_state = state;
|
||||
self.placePageView.anchorImage.transform = state == State::Top ? CGAffineTransformMakeRotation(M_PI)
|
||||
: CGAffineTransformIdentity;
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDelegate
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
if (indexPath.section != 0)
|
||||
return;
|
||||
|
||||
CGFloat offset = 0;
|
||||
if (self.state == State::Top)
|
||||
{
|
||||
self.state = State::Bottom;
|
||||
offset = self.expandedContentOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.state = State::Top;
|
||||
offset = self.topContentOffset;
|
||||
}
|
||||
place_page_layout::animate(^{ [self.scrollView setContentOffset:{0, offset} animated:YES]; });
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
@ -11,7 +12,7 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="75"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="QJs-zE-xfN" id="n1O-q5-zmj">
|
||||
<frame key="frameInset" width="375" height="74"/>
|
||||
<frame key="frameInset" width="375" height="74.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="248" verticalHuggingPriority="251" text="Sun-Wed, Fri-Sat" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YIs-LL-j77" userLabel="Days">
|
||||
|
@ -41,27 +42,16 @@
|
|||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="separator_image" translatesAutoresizingMaskIntoConstraints="NO" id="Qi6-29-xXe">
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="5vM-VX-4hL"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="coloring" value="MWMSeparator"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="Qi6-29-xXe" secondAttribute="bottom" id="1Cs-EO-9rW"/>
|
||||
<constraint firstItem="iYw-fc-mKi" firstAttribute="top" secondItem="vjg-UU-FVu" secondAttribute="bottom" constant="4" id="LaC-Fj-SGw"/>
|
||||
<constraint firstItem="Qi6-29-xXe" firstAttribute="leading" secondItem="n1O-q5-zmj" secondAttribute="leading" constant="60" id="LqT-6i-l9O"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Qi6-29-xXe" secondAttribute="trailing" id="Mlw-ei-y2k"/>
|
||||
<constraint firstItem="YIs-LL-j77" firstAttribute="leading" secondItem="n1O-q5-zmj" secondAttribute="leading" constant="60" id="Pqu-1L-AJT"/>
|
||||
<constraint firstItem="vjg-UU-FVu" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="YIs-LL-j77" secondAttribute="trailing" constant="10" id="S0j-ZD-Yzm"/>
|
||||
<constraint firstAttribute="trailing" secondItem="vjg-UU-FVu" secondAttribute="trailing" constant="16" id="Y3R-u7-9vy"/>
|
||||
<constraint firstItem="iYw-fc-mKi" firstAttribute="top" secondItem="YIs-LL-j77" secondAttribute="bottom" constant="4" id="c2Y-bD-pvv"/>
|
||||
<constraint firstAttribute="trailing" secondItem="iYw-fc-mKi" secondAttribute="trailing" constant="16" id="fDs-dk-Fok"/>
|
||||
<constraint firstItem="YIs-LL-j77" firstAttribute="top" secondItem="n1O-q5-zmj" secondAttribute="top" constant="14" id="hto-60-gvp"/>
|
||||
<constraint firstItem="Qi6-29-xXe" firstAttribute="top" secondItem="iYw-fc-mKi" secondAttribute="bottom" constant="14" id="jzQ-NL-iE4"/>
|
||||
<constraint firstAttribute="bottom" secondItem="iYw-fc-mKi" secondAttribute="bottom" constant="15" id="j14-1H-U4E"/>
|
||||
<constraint firstItem="iYw-fc-mKi" firstAttribute="leading" secondItem="n1O-q5-zmj" secondAttribute="leading" constant="60" id="qgW-Wu-maW"/>
|
||||
<constraint firstItem="vjg-UU-FVu" firstAttribute="top" secondItem="n1O-q5-zmj" secondAttribute="top" constant="14" id="qzM-8s-sDR"/>
|
||||
</constraints>
|
||||
|
@ -70,14 +60,10 @@
|
|||
<outlet property="breaks" destination="iYw-fc-mKi" id="2ez-hw-xaw"/>
|
||||
<outlet property="days" destination="YIs-LL-j77" id="dqM-WD-2NN"/>
|
||||
<outlet property="schedule" destination="vjg-UU-FVu" id="Xdv-dH-NPZ"/>
|
||||
<outlet property="separator" destination="Qi6-29-xXe" id="0Zl-dQ-Kmw"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-66.5" y="24.5"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="separator_image" width="1" height="1"/>
|
||||
</resources>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
|
|
|
@ -9,11 +9,11 @@
|
|||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MWMPPPAddress" id="bz2-BF-3Qa" customClass="_MWMPPPAddress">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="28"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="_MWMPPPAddress" rowHeight="44" id="bz2-BF-3Qa" customClass="_MWMPPPAddress">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bz2-BF-3Qa" id="kgP-ci-4Fj">
|
||||
<frame key="frameInset" width="320" height="27"/>
|
||||
<frame key="frameInset" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9gi-wZ-XKX" userLabel="Distance Box">
|
||||
|
@ -68,12 +68,12 @@
|
|||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="9gi-wZ-XKX" secondAttribute="trailing" id="4IY-d9-7Qe"/>
|
||||
<constraint firstAttribute="trailing" secondItem="9gi-wZ-XKX" secondAttribute="trailing" constant="16" id="4IY-d9-7Qe"/>
|
||||
<constraint firstItem="9gi-wZ-XKX" firstAttribute="leading" secondItem="g80-iK-Lm4" secondAttribute="trailing" priority="500" constant="8" id="QdH-SI-U3V"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="g80-iK-Lm4" secondAttribute="trailing" priority="750" id="ReC-iw-nQo"/>
|
||||
<constraint firstItem="9gi-wZ-XKX" firstAttribute="top" secondItem="kgP-ci-4Fj" secondAttribute="top" constant="7" id="ahP-3e-LSZ"/>
|
||||
<constraint firstItem="g80-iK-Lm4" firstAttribute="top" secondItem="kgP-ci-4Fj" secondAttribute="top" constant="7" id="dyX-RT-RyA"/>
|
||||
<constraint firstItem="g80-iK-Lm4" firstAttribute="leading" secondItem="kgP-ci-4Fj" secondAttribute="leading" id="eKV-2t-e5B"/>
|
||||
<constraint firstItem="g80-iK-Lm4" firstAttribute="leading" secondItem="kgP-ci-4Fj" secondAttribute="leading" constant="16" id="eKV-2t-e5B"/>
|
||||
<constraint firstAttribute="bottom" secondItem="g80-iK-Lm4" secondAttribute="bottom" id="kMh-wD-wdh"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<outlet property="distanceView" destination="9gi-wZ-XKX" id="9Lr-TG-2gw"/>
|
||||
<outlet property="trailing" destination="ReC-iw-nQo" id="l2t-1p-S58"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="327" y="722"/>
|
||||
<point key="canvasLocation" x="327" y="727"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11201" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<dependencies>
|
||||
<deployment version="2048" identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
|
||||
|
@ -8,7 +8,7 @@
|
|||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MWMPPPBooking" id="ngD-jq-BYV" customClass="_MWMPPPBooking">
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="_MWMPPPBooking" id="ngD-jq-BYV" customClass="_MWMPPPBooking">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ngD-jq-BYV" id="Zth-C7-aXm">
|
||||
|
@ -26,7 +26,7 @@
|
|||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="separator_image" translatesAutoresizingMaskIntoConstraints="NO" id="t1Z-Sp-Xi5">
|
||||
<imageView hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="separator_image" translatesAutoresizingMaskIntoConstraints="NO" id="t1Z-Sp-Xi5">
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="LZA-3w-U5e"/>
|
||||
</constraints>
|
||||
|
@ -53,8 +53,8 @@
|
|||
<constraint firstItem="t1Z-Sp-Xi5" firstAttribute="leading" secondItem="F9f-pg-4uU" secondAttribute="leading" id="IVw-lx-R1A"/>
|
||||
<constraint firstItem="Thk-j3-Or0" firstAttribute="leading" secondItem="Rhl-Xh-qMc" secondAttribute="trailing" constant="8" id="WoG-Ia-GgK"/>
|
||||
<constraint firstItem="Rhl-Xh-qMc" firstAttribute="top" secondItem="F9f-pg-4uU" secondAttribute="top" id="Y2R-r3-PtN"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Thk-j3-Or0" secondAttribute="trailing" id="g3j-ax-kfh"/>
|
||||
<constraint firstItem="Rhl-Xh-qMc" firstAttribute="leading" secondItem="F9f-pg-4uU" secondAttribute="leading" id="lTe-fz-jdC"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Thk-j3-Or0" secondAttribute="trailing" constant="16" id="g3j-ax-kfh"/>
|
||||
<constraint firstItem="Rhl-Xh-qMc" firstAttribute="leading" secondItem="F9f-pg-4uU" secondAttribute="leading" constant="16" id="lTe-fz-jdC"/>
|
||||
<constraint firstItem="Thk-j3-Or0" firstAttribute="top" secondItem="F9f-pg-4uU" secondAttribute="top" id="zO5-6f-qZD"/>
|
||||
</constraints>
|
||||
</view>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MWMPPPExternalTitle" id="BGG-6x-Yz5" customClass="_MWMPPPExternalTitle">
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="_MWMPPPExternalTitle" id="BGG-6x-Yz5" customClass="_MWMPPPExternalTitle">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="BGG-6x-Yz5" id="qw4-Pb-AUe">
|
||||
|
@ -68,12 +68,12 @@
|
|||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="ugv-HY-Iyx" firstAttribute="leading" secondItem="RVZ-XQ-Hc9" secondAttribute="trailing" priority="500" constant="8" id="Aey-Ea-IiP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ugv-HY-Iyx" secondAttribute="trailing" id="FBP-qb-iYH"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ugv-HY-Iyx" secondAttribute="trailing" constant="16" id="FBP-qb-iYH"/>
|
||||
<constraint firstAttribute="bottom" secondItem="ugv-HY-Iyx" secondAttribute="bottom" id="J9l-KA-e20"/>
|
||||
<constraint firstItem="ugv-HY-Iyx" firstAttribute="top" secondItem="qw4-Pb-AUe" secondAttribute="top" constant="3" id="KGm-L4-5Pj"/>
|
||||
<constraint firstItem="RVZ-XQ-Hc9" firstAttribute="top" secondItem="qw4-Pb-AUe" secondAttribute="top" constant="4" id="Vep-PM-Fnb"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="RVZ-XQ-Hc9" secondAttribute="trailing" priority="750" id="gTr-DS-WO3"/>
|
||||
<constraint firstItem="RVZ-XQ-Hc9" firstAttribute="leading" secondItem="qw4-Pb-AUe" secondAttribute="leading" id="pyI-Wm-46c"/>
|
||||
<constraint firstItem="RVZ-XQ-Hc9" firstAttribute="leading" secondItem="qw4-Pb-AUe" secondAttribute="leading" constant="16" id="pyI-Wm-46c"/>
|
||||
<constraint firstAttribute="bottom" secondItem="RVZ-XQ-Hc9" secondAttribute="bottom" id="tIE-kq-5JG"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MWMPPPSchedule" id="HVA-4K-8ma" customClass="_MWMPPPSchedule">
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="_MWMPPPSchedule" id="HVA-4K-8ma" customClass="_MWMPPPSchedule">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HVA-4K-8ma" id="Vj6-NH-gE1">
|
||||
|
@ -68,10 +68,10 @@
|
|||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="BQA-1t-HxB" secondAttribute="bottom" id="JlE-1h-DrI"/>
|
||||
<constraint firstItem="fDX-g2-0au" firstAttribute="leading" secondItem="Vj6-NH-gE1" secondAttribute="leading" id="KgC-ae-UIS"/>
|
||||
<constraint firstItem="fDX-g2-0au" firstAttribute="leading" secondItem="Vj6-NH-gE1" secondAttribute="leading" constant="16" id="KgC-ae-UIS"/>
|
||||
<constraint firstAttribute="bottom" secondItem="fDX-g2-0au" secondAttribute="bottom" constant="0.5" id="NJW-Tu-wrB"/>
|
||||
<constraint firstItem="fDX-g2-0au" firstAttribute="top" secondItem="Vj6-NH-gE1" secondAttribute="top" constant="4" id="NzT-aJ-MUo"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BQA-1t-HxB" secondAttribute="trailing" id="TxV-7f-VK5"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BQA-1t-HxB" secondAttribute="trailing" constant="16" id="TxV-7f-VK5"/>
|
||||
<constraint firstItem="BQA-1t-HxB" firstAttribute="leading" secondItem="fDX-g2-0au" secondAttribute="trailing" priority="500" constant="8" id="V72-o8-GUw"/>
|
||||
<constraint firstItem="BQA-1t-HxB" firstAttribute="top" secondItem="Vj6-NH-gE1" secondAttribute="top" constant="3" id="dG3-Rs-qKT"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="fDX-g2-0au" secondAttribute="trailing" priority="750" id="mdD-gF-WZW"/>
|
||||
|
|
35
iphone/Maps/Classes/_MWMPPPSpace.xib
Normal file
35
iphone/Maps/Classes/_MWMPPPSpace.xib
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="16" id="e80-Up-JKd">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="e80-Up-JKd" id="Ko3-Cf-A8Q">
|
||||
<frame key="frameInset" width="375" height="15"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Xvd-Wu-4VH">
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" priority="750" constant="15" id="da2-0A-6d4"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="Xvd-Wu-4VH" secondAttribute="trailing" id="7p0-En-2Ov"/>
|
||||
<constraint firstItem="Xvd-Wu-4VH" firstAttribute="top" secondItem="Ko3-Cf-A8Q" secondAttribute="top" id="G3l-4B-ztr"/>
|
||||
<constraint firstItem="Xvd-Wu-4VH" firstAttribute="leading" secondItem="Ko3-Cf-A8Q" secondAttribute="leading" id="jlH-bx-hTM"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Xvd-Wu-4VH" secondAttribute="bottom" id="lzf-WQ-Gy6"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<point key="canvasLocation" x="21" y="58"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
|
@ -9,7 +9,7 @@
|
|||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MWMPPPSubtitle" id="uPP-a7-pwR" customClass="_MWMPPPSubtitle">
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="_MWMPPPSubtitle" id="uPP-a7-pwR" customClass="_MWMPPPSubtitle">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="uPP-a7-pwR" id="32Q-dS-DC0">
|
||||
|
@ -72,8 +72,8 @@
|
|||
<constraint firstAttribute="trailingMargin" secondItem="7eI-u4-YYe" secondAttribute="trailing" priority="750" id="Xy5-rf-Gp5"/>
|
||||
<constraint firstItem="7eI-u4-YYe" firstAttribute="top" secondItem="32Q-dS-DC0" secondAttribute="top" constant="4" id="d6c-V2-5sp"/>
|
||||
<constraint firstAttribute="bottom" secondItem="eHp-si-h1T" secondAttribute="bottom" id="fVo-GO-rno"/>
|
||||
<constraint firstItem="7eI-u4-YYe" firstAttribute="leading" secondItem="32Q-dS-DC0" secondAttribute="leading" id="t4R-SJ-7gL"/>
|
||||
<constraint firstAttribute="trailing" secondItem="eHp-si-h1T" secondAttribute="trailing" id="xVy-Vw-zeg"/>
|
||||
<constraint firstItem="7eI-u4-YYe" firstAttribute="leading" secondItem="32Q-dS-DC0" secondAttribute="leading" constant="16" id="t4R-SJ-7gL"/>
|
||||
<constraint firstAttribute="trailing" secondItem="eHp-si-h1T" secondAttribute="trailing" constant="16" id="xVy-Vw-zeg"/>
|
||||
<constraint firstItem="eHp-si-h1T" firstAttribute="leading" secondItem="7eI-u4-YYe" secondAttribute="trailing" priority="500" constant="8" id="zrW-8g-wwY"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="_MWMPPPTitle" id="pV6-Se-WUl" customClass="_MWMPPPTitle">
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="_MWMPPPTitle" id="pV6-Se-WUl" customClass="_MWMPPPTitle">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="pV6-Se-WUl" id="9Ek-CZ-WD2">
|
||||
|
@ -72,8 +72,8 @@
|
|||
<constraint firstAttribute="trailingMargin" secondItem="reR-BO-1en" secondAttribute="trailing" priority="750" id="Jj2-xo-qfY"/>
|
||||
<constraint firstItem="BgA-ZV-xGI" firstAttribute="leading" secondItem="reR-BO-1en" secondAttribute="trailing" priority="500" constant="8" id="Mql-sB-OGC"/>
|
||||
<constraint firstItem="BgA-ZV-xGI" firstAttribute="top" secondItem="9Ek-CZ-WD2" secondAttribute="top" constant="2" id="QV6-9L-Vi0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BgA-ZV-xGI" secondAttribute="trailing" id="Yle-ie-ms5"/>
|
||||
<constraint firstItem="reR-BO-1en" firstAttribute="leading" secondItem="9Ek-CZ-WD2" secondAttribute="leading" id="n3E-vj-86W"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BgA-ZV-xGI" secondAttribute="trailing" constant="16" id="Yle-ie-ms5"/>
|
||||
<constraint firstItem="reR-BO-1en" firstAttribute="leading" secondItem="9Ek-CZ-WD2" secondAttribute="leading" constant="16" id="n3E-vj-86W"/>
|
||||
<constraint firstAttribute="bottom" secondItem="BgA-ZV-xGI" secondAttribute="bottom" constant="0.5" id="o3O-o2-QYz"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
|
|
|
@ -767,6 +767,8 @@
|
|||
F63BA3711BCD5B520044C504 /* MWMTTSLanguageViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F63BA3701BCD5B520044C504 /* MWMTTSLanguageViewController.mm */; };
|
||||
F645B6491D6C482400A69989 /* MWMPlacePageManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = F645B6481D6C482400A69989 /* MWMPlacePageManager.mm */; };
|
||||
F645B64A1D6C482400A69989 /* MWMPlacePageManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = F645B6481D6C482400A69989 /* MWMPlacePageManager.mm */; };
|
||||
F64923101DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F649230F1DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm */; };
|
||||
F64923111DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F649230F1DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm */; };
|
||||
F64D9C9B1C8861BA0063FA30 /* MWMObjectsCategorySelectorController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F653CE1B1C7361DA00A453F1 /* MWMObjectsCategorySelectorController.mm */; };
|
||||
F64D9C9F1C899C350063FA30 /* MWMEditorViralAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64D9C9E1C899C350063FA30 /* MWMEditorViralAlert.mm */; };
|
||||
F64D9CA01C899C350063FA30 /* MWMEditorViralAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64D9C9E1C899C350063FA30 /* MWMEditorViralAlert.mm */; };
|
||||
|
@ -800,14 +802,16 @@
|
|||
F6588E2F1B15D2BC00EE1E58 /* MWMBookmarkColorViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6588E2E1B15D2BC00EE1E58 /* MWMBookmarkColorViewController.mm */; };
|
||||
F6588E331B15D73100EE1E58 /* MWMBookmarkColorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6588E321B15D73100EE1E58 /* MWMBookmarkColorViewController.xib */; };
|
||||
F659FC6A1CF35C24000A06B1 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F659FC691CF35C24000A06B1 /* SafariServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||
F65B31F11DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm in Sources */ = {isa = PBXBuildFile; fileRef = F65B31F01DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm */; };
|
||||
F65B31F21DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm in Sources */ = {isa = PBXBuildFile; fileRef = F65B31F01DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm */; };
|
||||
F65B31F51DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm in Sources */ = {isa = PBXBuildFile; fileRef = F65B31F41DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm */; };
|
||||
F65B31F61DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm in Sources */ = {isa = PBXBuildFile; fileRef = F65B31F41DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm */; };
|
||||
F6671C6B1BA2EFD500548008 /* libFlurry_7.1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6671C6A1BA2EFD500548008 /* libFlurry_7.1.0.a */; };
|
||||
F668F6561BCD4507002D6FFC /* MWMTTSSettingsViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F668F6551BCD4507002D6FFC /* MWMTTSSettingsViewController.mm */; };
|
||||
F66A8FA81B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FA71B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm */; };
|
||||
F66A8FAC1B09F137001B9C97 /* MWMiPadPlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FAB1B09F137001B9C97 /* MWMiPadPlacePage.mm */; };
|
||||
F66A8FB01B09F268001B9C97 /* MWMPlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FAF1B09F268001B9C97 /* MWMPlacePage.mm */; };
|
||||
F66A8FB21B0A0954001B9C97 /* PlacePageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F66A8FB11B0A0954001B9C97 /* PlacePageView.xib */; };
|
||||
F67223761D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F67223741D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm */; };
|
||||
F67223771D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F67223741D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm */; };
|
||||
F67223781D74800600A3BDA2 /* MWMPlacePagePreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F67223751D74800600A3BDA2 /* MWMPlacePagePreviewCell.xib */; };
|
||||
F67223791D74800600A3BDA2 /* MWMPlacePagePreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F67223751D74800600A3BDA2 /* MWMPlacePagePreviewCell.xib */; };
|
||||
F67517A21D76FC46008FE34F /* MWMPlacePageLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = F67517A11D76FC46008FE34F /* MWMPlacePageLayout.mm */; };
|
||||
|
@ -823,8 +827,10 @@
|
|||
F68FCB8B1DA7BD20007CC7D7 /* MWMTaxiPreviewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F68FCB881DA7BD20007CC7D7 /* MWMTaxiPreviewCell.mm */; };
|
||||
F68FCB8C1DA7BD20007CC7D7 /* MWMTaxiPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F68FCB891DA7BD20007CC7D7 /* MWMTaxiPreviewCell.xib */; };
|
||||
F68FCB8D1DA7BD20007CC7D7 /* MWMTaxiPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F68FCB891DA7BD20007CC7D7 /* MWMTaxiPreviewCell.xib */; };
|
||||
F69E911C1D994CF000D7A778 /* MWMOpeningHoursCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F69E911B1D994CF000D7A778 /* MWMOpeningHoursCell.mm */; };
|
||||
F69E911D1D994CF000D7A778 /* MWMOpeningHoursCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F69E911B1D994CF000D7A778 /* MWMOpeningHoursCell.mm */; };
|
||||
F69AEEB51DDB1AE700BE034A /* _MWMPPPSpace.xib in Resources */ = {isa = PBXBuildFile; fileRef = F69AEEB41DDB1AE700BE034A /* _MWMPPPSpace.xib */; };
|
||||
F69AEEB61DDB1AE700BE034A /* _MWMPPPSpace.xib in Resources */ = {isa = PBXBuildFile; fileRef = F69AEEB41DDB1AE700BE034A /* _MWMPPPSpace.xib */; };
|
||||
F69AEEB91DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F69AEEB81DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm */; };
|
||||
F69AEEBA1DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F69AEEB81DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm */; };
|
||||
F69E91201D994D1A00D7A778 /* MWMOpeningHoursCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F69E911F1D994D1A00D7A778 /* MWMOpeningHoursCell.xib */; };
|
||||
F69E91211D994D1A00D7A778 /* MWMOpeningHoursCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F69E911F1D994D1A00D7A778 /* MWMOpeningHoursCell.xib */; };
|
||||
F69E91231D99511F00D7A778 /* _MWMOHHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F69E91221D99511F00D7A778 /* _MWMOHHeaderCell.xib */; };
|
||||
|
@ -1564,6 +1570,8 @@
|
|||
F645B6471D6C482400A69989 /* MWMPlacePageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePageManager.h; sourceTree = "<group>"; };
|
||||
F645B6481D6C482400A69989 /* MWMPlacePageManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPlacePageManager.mm; sourceTree = "<group>"; };
|
||||
F645B64B1D6C52F600A69989 /* MWMPlacePageProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePageProtocol.h; sourceTree = "<group>"; };
|
||||
F649230E1DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPPPreviewLayoutHelper.h; sourceTree = "<group>"; };
|
||||
F649230F1DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPPPreviewLayoutHelper.mm; sourceTree = "<group>"; };
|
||||
F64D9C9D1C899C350063FA30 /* MWMEditorViralAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMEditorViralAlert.h; sourceTree = "<group>"; };
|
||||
F64D9C9E1C899C350063FA30 /* MWMEditorViralAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMEditorViralAlert.mm; sourceTree = "<group>"; };
|
||||
F64D9CA11C899C760063FA30 /* MWMEditorViralAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMEditorViralAlert.xib; sourceTree = "<group>"; };
|
||||
|
@ -1604,6 +1612,11 @@
|
|||
F6588E2E1B15D2BC00EE1E58 /* MWMBookmarkColorViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMBookmarkColorViewController.mm; sourceTree = "<group>"; };
|
||||
F6588E321B15D73100EE1E58 /* MWMBookmarkColorViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMBookmarkColorViewController.xib; sourceTree = "<group>"; };
|
||||
F659FC691CF35C24000A06B1 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = System/Library/Frameworks/SafariServices.framework; sourceTree = SDKROOT; };
|
||||
F65B31EE1DD20DEC00105FDE /* MWMPlacePageLayoutImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePageLayoutImpl.h; sourceTree = "<group>"; };
|
||||
F65B31EF1DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMiPhonePlacePageLayoutImpl.h; sourceTree = "<group>"; };
|
||||
F65B31F01DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMiPhonePlacePageLayoutImpl.mm; sourceTree = "<group>"; };
|
||||
F65B31F31DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMiPadPlacePageLayoutImpl.h; sourceTree = "<group>"; };
|
||||
F65B31F41DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMiPadPlacePageLayoutImpl.mm; sourceTree = "<group>"; };
|
||||
F6671C6A1BA2EFD500548008 /* libFlurry_7.1.0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libFlurry_7.1.0.a; path = Frameworks/libFlurry_7.1.0.a; sourceTree = "<group>"; };
|
||||
F668F6541BCD4507002D6FFC /* MWMTTSSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMTTSSettingsViewController.h; sourceTree = "<group>"; };
|
||||
F668F6551BCD4507002D6FFC /* MWMTTSSettingsViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMTTSSettingsViewController.mm; sourceTree = "<group>"; };
|
||||
|
@ -1614,8 +1627,6 @@
|
|||
F66A8FAE1B09F268001B9C97 /* MWMPlacePage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePage.h; sourceTree = "<group>"; };
|
||||
F66A8FAF1B09F268001B9C97 /* MWMPlacePage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPlacePage.mm; sourceTree = "<group>"; };
|
||||
F66A8FB11B0A0954001B9C97 /* PlacePageView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PlacePageView.xib; sourceTree = "<group>"; };
|
||||
F67223731D74800600A3BDA2 /* MWMPlacePagePreviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePagePreviewCell.h; sourceTree = "<group>"; };
|
||||
F67223741D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPlacePagePreviewCell.mm; sourceTree = "<group>"; };
|
||||
F67223751D74800600A3BDA2 /* MWMPlacePagePreviewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMPlacePagePreviewCell.xib; sourceTree = "<group>"; };
|
||||
F67517A01D76FC46008FE34F /* MWMPlacePageLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPlacePageLayout.h; sourceTree = "<group>"; };
|
||||
F67517A11D76FC46008FE34F /* MWMPlacePageLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPlacePageLayout.mm; sourceTree = "<group>"; };
|
||||
|
@ -1627,8 +1638,9 @@
|
|||
F68FCB871DA7BD20007CC7D7 /* MWMTaxiPreviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMTaxiPreviewCell.h; sourceTree = "<group>"; };
|
||||
F68FCB881DA7BD20007CC7D7 /* MWMTaxiPreviewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMTaxiPreviewCell.mm; sourceTree = "<group>"; };
|
||||
F68FCB891DA7BD20007CC7D7 /* MWMTaxiPreviewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMTaxiPreviewCell.xib; sourceTree = "<group>"; };
|
||||
F69E911A1D994CF000D7A778 /* MWMOpeningHoursCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursCell.h; sourceTree = "<group>"; };
|
||||
F69E911B1D994CF000D7A778 /* MWMOpeningHoursCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursCell.mm; sourceTree = "<group>"; };
|
||||
F69AEEB41DDB1AE700BE034A /* _MWMPPPSpace.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = _MWMPPPSpace.xib; sourceTree = "<group>"; };
|
||||
F69AEEB71DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursLayoutHelper.h; sourceTree = "<group>"; };
|
||||
F69AEEB81DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursLayoutHelper.mm; sourceTree = "<group>"; };
|
||||
F69E911F1D994D1A00D7A778 /* MWMOpeningHoursCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMOpeningHoursCell.xib; sourceTree = "<group>"; };
|
||||
F69E91221D99511F00D7A778 /* _MWMOHHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = _MWMOHHeaderCell.xib; sourceTree = "<group>"; };
|
||||
F69E91251D99513100D7A778 /* _MWMOHSubCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = _MWMOHSubCell.xib; sourceTree = "<group>"; };
|
||||
|
@ -2904,8 +2916,7 @@
|
|||
F634C8EE1D787A8F00BE04E2 /* Preview */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F67223731D74800600A3BDA2 /* MWMPlacePagePreviewCell.h */,
|
||||
F67223741D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm */,
|
||||
F69AEEB41DDB1AE700BE034A /* _MWMPPPSpace.xib */,
|
||||
F634C8FE1D79999A00BE04E2 /* _MWMPPPAddress.xib */,
|
||||
F634C8FB1D79998C00BE04E2 /* _MWMPPPBooking.xib */,
|
||||
F634C8F81D79998200BE04E2 /* _MWMPPPSchedule.xib */,
|
||||
|
@ -2913,6 +2924,8 @@
|
|||
F634C8F21D79996D00BE04E2 /* _MWMPPPExternalTitle.xib */,
|
||||
F634C8EF1D79994900BE04E2 /* _MWMPPPTitle.xib */,
|
||||
F67223751D74800600A3BDA2 /* MWMPlacePagePreviewCell.xib */,
|
||||
F649230E1DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.h */,
|
||||
F649230F1DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm */,
|
||||
);
|
||||
name = Preview;
|
||||
sourceTree = "<group>";
|
||||
|
@ -3112,6 +3125,18 @@
|
|||
name = TextView;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F65B31F71DD2109E00105FDE /* Impl */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F65B31EE1DD20DEC00105FDE /* MWMPlacePageLayoutImpl.h */,
|
||||
F65B31EF1DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.h */,
|
||||
F65B31F01DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm */,
|
||||
F65B31F31DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.h */,
|
||||
F65B31F41DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm */,
|
||||
);
|
||||
name = Impl;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F66A8FA51B09F02A001B9C97 /* OrientationVariants */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -3171,13 +3196,13 @@
|
|||
F69E911E1D994D0600D7A778 /* OpenningHours */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F69E911A1D994CF000D7A778 /* MWMOpeningHoursCell.h */,
|
||||
F69E911B1D994CF000D7A778 /* MWMOpeningHoursCell.mm */,
|
||||
F69E91221D99511F00D7A778 /* _MWMOHHeaderCell.xib */,
|
||||
F69E91251D99513100D7A778 /* _MWMOHSubCell.xib */,
|
||||
F69E911F1D994D1A00D7A778 /* MWMOpeningHoursCell.xib */,
|
||||
F69E91281D9A877A00D7A778 /* MWMOpeningHours.h */,
|
||||
F69E91291D9A877A00D7A778 /* MWMOpeningHours.mm */,
|
||||
F69AEEB71DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.h */,
|
||||
F69AEEB81DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm */,
|
||||
);
|
||||
name = OpenningHours;
|
||||
sourceTree = "<group>";
|
||||
|
@ -3287,6 +3312,7 @@
|
|||
F6E2B00B1D9E944600793C36 /* MWMPPView.h */,
|
||||
F6E2B00C1D9E944600793C36 /* MWMPPView.mm */,
|
||||
F67E751B1DB635FE00D6741F /* MWMPPView.xib */,
|
||||
F65B31F71DD2109E00105FDE /* Impl */,
|
||||
);
|
||||
name = Layout;
|
||||
sourceTree = "<group>";
|
||||
|
@ -3753,6 +3779,7 @@
|
|||
349A357B1B53D4C9009677EE /* MWMCircularProgress.xib in Resources */,
|
||||
F634C8FF1D79999A00BE04E2 /* _MWMPPPAddress.xib in Resources */,
|
||||
F634C8F31D79996D00BE04E2 /* _MWMPPPExternalTitle.xib in Resources */,
|
||||
F69AEEB51DDB1AE700BE034A /* _MWMPPPSpace.xib in Resources */,
|
||||
F6CB21621AEE902B00FB8963 /* PlacePageLinkCell.xib in Resources */,
|
||||
3401CD781C3CED1E0028C6F8 /* MWMEditorSelectTableViewCell.xib in Resources */,
|
||||
34B82AD11B846B2C00180497 /* MWMSearchBookmarksCell.xib in Resources */,
|
||||
|
@ -3914,6 +3941,7 @@
|
|||
6741A9891BF340DE002C974C /* MWMSearchHistoryClearCell.xib in Resources */,
|
||||
347FD86A1C60B2CE002FB65E /* MWMOpeningHoursAddClosedTableViewCell.xib in Resources */,
|
||||
6741A98A1BF340DE002C974C /* MWMRoutePointCell.xib in Resources */,
|
||||
F69AEEB61DDB1AE700BE034A /* _MWMPPPSpace.xib in Resources */,
|
||||
6741A98B1BF340DE002C974C /* MWMCircularProgress.xib in Resources */,
|
||||
6741A98C1BF340DE002C974C /* PlacePageLinkCell.xib in Resources */,
|
||||
6741A98F1BF340DE002C974C /* MWMSearchBookmarksCell.xib in Resources */,
|
||||
|
@ -4028,6 +4056,7 @@
|
|||
34FE4C451BCC013500066718 /* MWMMapWidgets.mm in Sources */,
|
||||
347FD8831C60B2CE002FB65E /* MWMOpeningHoursTableViewCell.mm in Sources */,
|
||||
F6F722F81AE1572400DA3DA1 /* MWMiPhonePortraitPlacePage.mm in Sources */,
|
||||
F65B31F51DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm in Sources */,
|
||||
F6CB21681AEFC6AA00FB8963 /* MWMPlacePageActionBar.mm in Sources */,
|
||||
34E273251C73876500463965 /* MWMMigrationView.mm in Sources */,
|
||||
347FD87B1C60B2CE002FB65E /* MWMOpeningHoursDeleteScheduleTableViewCell.mm in Sources */,
|
||||
|
@ -4091,7 +4120,6 @@
|
|||
34B104261D6F040E00C8B577 /* MWMAboutController.mm in Sources */,
|
||||
3465E7D81B6658C000854C4D /* MWMAPIBar.mm in Sources */,
|
||||
F6D409FA1B319BD70041730F /* ContextViews.mm in Sources */,
|
||||
F69E911C1D994CF000D7A778 /* MWMOpeningHoursCell.mm in Sources */,
|
||||
342CC5F11C2D7730005F3FE5 /* MWMAuthorizationLoginViewController.mm in Sources */,
|
||||
347FD8851C60B2CE002FB65E /* MWMOpeningHoursTimeSelectorTableViewCell.mm in Sources */,
|
||||
34EB84581C073DF70004689F /* MWMOpeningHoursEditorViewController.mm in Sources */,
|
||||
|
@ -4169,6 +4197,7 @@
|
|||
34B82AE21B84AC5E00180497 /* MWMSearchCategoriesManager.mm in Sources */,
|
||||
34CE8A671C7740E100F4351A /* MWMStorage.mm in Sources */,
|
||||
F6F7787A1DABC6D800B603E7 /* MWMTaxiCollectionLayout.mm in Sources */,
|
||||
F64923101DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm in Sources */,
|
||||
F6F533A31B3C248900C1940B /* UIColor+MapsMeColor.mm in Sources */,
|
||||
F69E912A1D9A877A00D7A778 /* MWMOpeningHours.mm in Sources */,
|
||||
34FED54D1D1D45B900183B1B /* MWMLocationPredictor.mm in Sources */,
|
||||
|
@ -4176,6 +4205,7 @@
|
|||
34C9BD041C6DB693000DC38D /* MWMViewController.mm in Sources */,
|
||||
CB252D6F16FF82C9001E41E9 /* Statistics.mm in Sources */,
|
||||
342AF0E01BE24E9A0016F3AE /* MWMMapDownloaderViewController.mm in Sources */,
|
||||
F69AEEB91DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm in Sources */,
|
||||
341F99DD1C6B1165001C67B8 /* MWMMapDownloaderSubplaceTableViewCell.mm in Sources */,
|
||||
343FAC4A1CBFBDFC00A45D3B /* MWMNoMapsView.mm in Sources */,
|
||||
6BA0BCD11B74DDBA00CC9969 /* MWMCustomFacebookEvents.mm in Sources */,
|
||||
|
@ -4205,7 +4235,6 @@
|
|||
F6BD33841B6240F200F2CE18 /* MWMNavigationView.mm in Sources */,
|
||||
3472EC051B4D44BE0085CB79 /* UIFont+MapsMeFonts.mm in Sources */,
|
||||
342AD76F1B53D30C00E0B997 /* UIButton+RuntimeAttributes.mm in Sources */,
|
||||
F67223761D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm in Sources */,
|
||||
F6D4A7411CC1643100BD4E5B /* MWMButtonCell.mm in Sources */,
|
||||
34AB39C11D2BD8310021857D /* MWMStopButton.mm in Sources */,
|
||||
34B924421DC8A29C0008D971 /* MWMMailViewController.mm in Sources */,
|
||||
|
@ -4219,6 +4248,7 @@
|
|||
340E10631B949D1900D975D5 /* MWMSearchBookmarksManager.mm in Sources */,
|
||||
F68FCB8A1DA7BD20007CC7D7 /* MWMTaxiPreviewCell.mm in Sources */,
|
||||
F6E9BF291CE364150050E534 /* MWMEditBookmarkController.mm in Sources */,
|
||||
F65B31F11DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm in Sources */,
|
||||
34A759CA1DC795140078C3AE /* MWMWelcomeController.mm in Sources */,
|
||||
34D15BA81BD8F93C00C8BCBE /* AddSetTableViewCell.mm in Sources */,
|
||||
F6A218491CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
|
||||
|
@ -4285,6 +4315,7 @@
|
|||
34A759DC1DC797880078C3AE /* MWMWelcomeController.mm in Sources */,
|
||||
6741A9C31BF340DE002C974C /* MWMPlacePageActionBar.mm in Sources */,
|
||||
6741A9C61BF340DE002C974C /* MWMSearchCommonCell.mm in Sources */,
|
||||
F65B31F61DD2106700105FDE /* MWMiPadPlacePageLayoutImpl.mm in Sources */,
|
||||
34E273261C73876500463965 /* MWMMigrationView.mm in Sources */,
|
||||
340C20E41C3E565600111D22 /* MWMCuisineEditorViewController.mm in Sources */,
|
||||
6741A9C81BF340DE002C974C /* MWMiPhoneLandscapePlacePage.mm in Sources */,
|
||||
|
@ -4351,7 +4382,6 @@
|
|||
34B104271D6F040E00C8B577 /* MWMAboutController.mm in Sources */,
|
||||
347FD8861C60B2CE002FB65E /* MWMOpeningHoursTimeSelectorTableViewCell.mm in Sources */,
|
||||
6741A9EB1BF340DE002C974C /* ContextViews.mm in Sources */,
|
||||
F69E911D1D994CF000D7A778 /* MWMOpeningHoursCell.mm in Sources */,
|
||||
6741A9EC1BF340DE002C974C /* MWMCircularProgress.mm in Sources */,
|
||||
342CC5F21C2D7730005F3FE5 /* MWMAuthorizationLoginViewController.mm in Sources */,
|
||||
6741A9EE1BF340DE002C974C /* MWMSearchCell.mm in Sources */,
|
||||
|
@ -4426,6 +4456,7 @@
|
|||
F639883C1CF70FE500226B6B /* MWMActionBarButton.mm in Sources */,
|
||||
34CE8A681C7740E100F4351A /* MWMStorage.mm in Sources */,
|
||||
6741AA141BF340DE002C974C /* MWMMultilineLabel.mm in Sources */,
|
||||
F64923111DD9E7DA00CC8EC7 /* MWMPPPreviewLayoutHelper.mm in Sources */,
|
||||
6741AA151BF340DE002C974C /* Statistics.mm in Sources */,
|
||||
34C9BD051C6DB693000DC38D /* MWMViewController.mm in Sources */,
|
||||
F69E912B1D9A877A00D7A778 /* MWMOpeningHours.mm in Sources */,
|
||||
|
@ -4433,6 +4464,7 @@
|
|||
6741AA171BF340DE002C974C /* SwitchCell.mm in Sources */,
|
||||
6741AA181BF340DE002C974C /* UIView+RuntimeAttributes.mm in Sources */,
|
||||
341F99DE1C6B1165001C67B8 /* MWMMapDownloaderSubplaceTableViewCell.mm in Sources */,
|
||||
F69AEEBA1DDB263E00BE034A /* MWMOpeningHoursLayoutHelper.mm in Sources */,
|
||||
F626D5331C3E846E00C17D15 /* UIImageView+Coloring.mm in Sources */,
|
||||
343FAC4B1CBFBDFC00A45D3B /* MWMNoMapsView.mm in Sources */,
|
||||
6741AA191BF340DE002C974C /* MWMDownloaderDialogCell.mm in Sources */,
|
||||
|
@ -4464,7 +4496,6 @@
|
|||
34A759E11DC7979C0078C3AE /* MWMWhatsNewNightModeController.mm in Sources */,
|
||||
6741AA251BF340DE002C974C /* MWMBottomMenuView.mm in Sources */,
|
||||
F6FEA82E1C58F108007223CC /* MWMButton.mm in Sources */,
|
||||
F67223771D74800600A3BDA2 /* MWMPlacePagePreviewCell.mm in Sources */,
|
||||
34B924431DC8A29C0008D971 /* MWMMailViewController.mm in Sources */,
|
||||
F6D4A7421CC1643100BD4E5B /* MWMButtonCell.mm in Sources */,
|
||||
34AB39C21D2BD8310021857D /* MWMStopButton.mm in Sources */,
|
||||
|
@ -4476,6 +4507,7 @@
|
|||
6741AA2B1BF340DE002C974C /* CircleView.mm in Sources */,
|
||||
56D545631C74A41900E3719C /* Framework.cpp in Sources */,
|
||||
F68FCB8B1DA7BD20007CC7D7 /* MWMTaxiPreviewCell.mm in Sources */,
|
||||
F65B31F21DD20E9600105FDE /* MWMiPhonePlacePageLayoutImpl.mm in Sources */,
|
||||
F6E9BF2A1CE364150050E534 /* MWMEditBookmarkController.mm in Sources */,
|
||||
6741AA2C1BF340DE002C974C /* MWMSearchBookmarksManager.mm in Sources */,
|
||||
F6A2184A1CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
|
||||
|
|
Loading…
Add table
Reference in a new issue