[ios] New iPad place page

This commit is contained in:
VladiMihaylenko 2016-11-09 18:02:59 +03:00
parent 915d8130a7
commit 889e54a785
40 changed files with 1529 additions and 1172 deletions

View file

@ -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;
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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];
}

View file

@ -1,10 +0,0 @@
#import "MWMTableViewCell.h"
@protocol MWMPlacePageCellUpdateProtocol;
@interface MWMOpeningHoursCell : MWMTableViewCell
- (void)configureWithOpeningHours:(NSString *)openingHours
updateLayoutDelegate:(id<MWMPlacePageCellUpdateProtocol>)delegate
isClosedNow:(BOOL)isClosedNow;
@end

View file

@ -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

View 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

View 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

View 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

View 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

View file

@ -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

View file

@ -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>

View file

@ -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;

View file

@ -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;

View file

@ -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)

View file

@ -1,5 +1,5 @@
@protocol MWMPlacePageCellUpdateProtocol<NSObject>
- (void)updateCellWithForceReposition:(BOOL)isForceReposition;
- (void)updateCell;
@end

View file

@ -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;

View file

@ -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());

View file

@ -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)
{

View file

@ -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

View file

@ -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

View 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

View file

@ -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
{
}

View file

@ -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

View file

@ -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

View file

@ -18,6 +18,7 @@
- (void)book:(BOOL)isDecription;
- (void)apiBack;
- (void)downloadSelectedArea;
@end

View file

@ -0,0 +1,5 @@
#import "MWMPlacePageLayoutImpl.h"
@interface MWMiPadPlacePageLayoutImpl : NSObject <MWMPlacePageLayoutImpl>
@end

View 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

View file

@ -0,0 +1,5 @@
#import "MWMPlacePageLayoutImpl.h"
@interface MWMiPhonePlacePageLayoutImpl : NSObject<MWMPlacePageLayoutImpl>
@end

View 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

View file

@ -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"/>

View file

@ -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>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="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>

View file

@ -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>

View file

@ -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"/>

View 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>

View file

@ -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>

View file

@ -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>

View file

@ -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 */,