[ios] Added "all maps" action buttons.

This commit is contained in:
Ilya Grechuhin 2016-04-19 14:42:45 +03:00
parent 63228af403
commit 2b2d886c80
4 changed files with 153 additions and 130 deletions

View file

@ -5,10 +5,6 @@
@interface MWMBaseMapDownloaderViewController : MWMViewController <UITableViewDelegate, MWMMapDownloaderProtocol, MWMMapDownloaderButtonTableViewCellProtocol>
@property (weak, nonatomic) IBOutlet UILabel * allMapsLabel;
@property (nonatomic) BOOL showAllMapsView;
- (void)configTable;
- (void)configAllMapsView;

View file

@ -1,6 +1,7 @@
#import "Common.h"
#import "MapsAppDelegate.h"
#import "MWMAlertViewController.h"
#import "MWMButton.h"
#import "MWMFrameworkListener.h"
#import "MWMMapDownloaderDefaultDataSource.h"
#import "MWMMapDownloaderLargeCountryTableViewCell.h"
@ -18,24 +19,25 @@
#include "storage/index.hpp"
extern NSString * const kCountryCellIdentifier = @"MWMMapDownloaderTableViewCell";
extern NSString * const kSubplaceCellIdentifier = @"MWMMapDownloaderSubplaceTableViewCell";
extern NSString * const kPlaceCellIdentifier = @"MWMMapDownloaderPlaceTableViewCell";
extern NSString * const kLargeCountryCellIdentifier = @"MWMMapDownloaderLargeCountryTableViewCell";
extern NSString * const kButtonCellIdentifier = @"MWMMapDownloaderButtonTableViewCell";
extern NSString * const kCountryCellIdentifier = @"MWMMapDownloaderTableViewCell";
extern NSString * const kLargeCountryCellIdentifier = @"MWMMapDownloaderLargeCountryTableViewCell";
extern NSString * const kPlaceCellIdentifier = @"MWMMapDownloaderPlaceTableViewCell";
extern NSString * const kSubplaceCellIdentifier = @"MWMMapDownloaderSubplaceTableViewCell";
namespace
{
NSString * const kAllMapsLabelFormat = @"%@ %@ (%@)";
NSString * const kAllMapsLabelFormat = @"%@ (%@)";
NSString * const kCancelActionTitle = L(@"cancel");
NSString * const kCancelAllTitle = L(@"downloader_cancel_all");
NSString * const kDeleteActionTitle = L(@"downloader_delete_map");
NSString * const kDownloaAllTitle = L(@"downloader_download_all_button");
NSString * const kDownloadActionTitle = L(@"downloader_download_map");
NSString * const kDownloadAllTitle = L(@"downloader_download_all_button");
NSString * const kDownloadingTitle = L(@"downloader_downloading");
NSString * const kMapsTitle = L(@"downloader_maps");
NSString * const kShowActionTitle = L(@"zoom_to_country");
NSString * const kUpdateActionTitle = L(@"downloader_status_outdated");
NSString * const kUpdateAllTitle = L(@"downloader_update_all_button");
NSString * const kBaseControllerIdentifier = @"MWMBaseMapDownloaderViewController";
NSString * const kControllerIdentifier = @"MWMMapDownloaderViewController";
@ -47,7 +49,8 @@ NSString * const kControllerIdentifier = @"MWMMapDownloaderViewController";
@property (weak, nonatomic) IBOutlet UIView * allMapsView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint * allMapsViewBottomOffset;
@property (weak, nonatomic) IBOutlet UIButton * allMapsButton;
@property (weak, nonatomic) IBOutlet MWMButton * allMapsButton;
@property (weak, nonatomic) IBOutlet MWMButton * allMapsCancelButton;
@property (nonatomic) UIImage * navBarBackground;
@property (nonatomic) UIImage * navBarShadow;
@ -66,6 +69,8 @@ NSString * const kControllerIdentifier = @"MWMMapDownloaderViewController";
@property (nonatomic, readonly) NSString * parentCountryId;
@property (nonatomic, readonly) TMWMMapDownloaderMode mode;
@property (nonatomic) BOOL showAllMapsButtons;
@end
using namespace storage;
@ -345,18 +350,47 @@ using namespace storage;
- (void)configAllMapsView
{
self.showAllMapsView = YES;
auto const & s = GetFramework().Storage();
TCountriesVec downloadedChildren;
TCountriesVec availableChildren;
TCountryId const parentCountryId = self.parentCountryId.UTF8String;
s.GetChildrenInGroups(parentCountryId, downloadedChildren, availableChildren);
if (availableChildren.empty())
if (self.mode == TMWMMapDownloaderMode::Downloaded)
{
Storage::UpdateInfo updateInfo{};
s.GetUpdateInfo(parentCountryId, updateInfo);
self.showAllMapsButtons = updateInfo.m_numberOfMwmFilesToUpdate != 0;
if (self.showAllMapsButtons)
{
self.allMapsButton.hidden = NO;
[self.allMapsButton
setTitle:[NSString stringWithFormat:kAllMapsLabelFormat, kUpdateAllTitle,
formattedSize(updateInfo.m_totalUpdateSizeInBytes)]
forState:UIControlStateNormal];
self.allMapsCancelButton.hidden = YES;
}
}
else if (parentCountryId != s.GetRootId())
{
TCountriesVec queuedChildren;
s.GetQueuedChildren(parentCountryId, queuedChildren);
if (!queuedChildren.empty())
if (queuedChildren.empty())
{
TCountriesVec downloadedChildren;
TCountriesVec availableChildren;
s.GetChildrenInGroups(parentCountryId, downloadedChildren, availableChildren, true /* keepAvailableChildren */);
self.showAllMapsButtons = downloadedChildren.size() != availableChildren.size();
if (self.showAllMapsButtons)
{
NodeAttrs nodeAttrs;
s.GetNodeAttrs(parentCountryId, nodeAttrs);
self.allMapsButton.hidden = NO;
[self.allMapsButton
setTitle:[NSString stringWithFormat:kAllMapsLabelFormat, kDownloadAllTitle,
formattedSize(nodeAttrs.m_mwmSize -
nodeAttrs.m_localMwmSize)]
forState:UIControlStateNormal];
self.allMapsCancelButton.hidden = YES;
}
}
else
{
TMwmSize queuedSize = 0;
for (TCountryId const & countryId : queuedChildren)
@ -365,29 +399,19 @@ using namespace storage;
s.GetNodeAttrs(countryId, nodeAttrs);
queuedSize += nodeAttrs.m_mwmSize;
}
self.allMapsLabel.text =
[NSString stringWithFormat:kAllMapsLabelFormat, kDownloadingTitle,
@(queuedChildren.size()), formattedSize(queuedSize)];
[self.allMapsButton setTitle:kCancelAllTitle forState:UIControlStateNormal];
return;
self.showAllMapsButtons = YES;
self.allMapsButton.hidden = YES;
self.allMapsCancelButton.hidden = NO;
[self.allMapsCancelButton
setTitle:[NSString stringWithFormat:kAllMapsLabelFormat, kCancelAllTitle,
formattedSize(queuedSize)]
forState:UIControlStateNormal];
}
}
else
{
NodeAttrs nodeAttrs;
s.GetNodeAttrs(parentCountryId, nodeAttrs);
uint32_t remoteMWMCounter = nodeAttrs.m_mwmCounter - nodeAttrs.m_localMwmCounter;
if (remoteMWMCounter != 0)
{
self.allMapsLabel.text =
[NSString stringWithFormat:kAllMapsLabelFormat, kMapsTitle, @(remoteMWMCounter),
formattedSize(nodeAttrs.m_mwmSize - nodeAttrs.m_localMwmSize)];
[self.allMapsButton setTitle:kDownloaAllTitle forState:UIControlStateNormal];
return;
}
self.showAllMapsButtons = NO;
}
self.showAllMapsView = NO;
}
- (void)refreshAllMapsView
@ -397,7 +421,7 @@ using namespace storage;
- (void)refreshAllMapsViewForOffset:(CGFloat)scrollOffset
{
if (!self.showAllMapsView)
if (!self.showAllMapsButtons)
return;
BOOL const hide = (scrollOffset >= self.lastScrollOffset) && !equalScreenDimensions(scrollOffset, 0.0);
self.lastScrollOffset = scrollOffset;
@ -423,7 +447,7 @@ using namespace storage;
{
self.skipCountryEventProcessing = YES;
TCountryId const parentCountryId = self.parentCountryId.UTF8String;
if (parentCountryId == GetFramework().Storage().GetRootId())
if (self.mode == TMWMMapDownloaderMode::Downloaded)
{
[Statistics logEvent:kStatDownloaderMapAction
withParameters:@{
@ -436,36 +460,37 @@ using namespace storage;
}
else
{
NSString * allMapsButtonTitle = [self.allMapsButton titleForState:UIControlStateNormal];
if ([allMapsButtonTitle isEqualToString:kDownloaAllTitle])
{
[Statistics logEvent:kStatDownloaderMapAction
withParameters:@{
kStatAction : kStatDownload,
kStatIsAuto : kStatNo,
kStatFrom : kStatDownloader,
kStatScenario : kStatDownloadGroup
}];
[MWMStorage downloadNode:parentCountryId
alertController:self.alertController
onSuccess:nil];
}
else if ([allMapsButtonTitle isEqualToString:kCancelAllTitle])
{
[Statistics logEvent:kStatDownloaderMapAction
withParameters:@{
kStatAction : kStatCancel,
kStatIsAuto : kStatNo,
kStatFrom : kStatDownloader,
kStatScenario : kStatDownloadGroup
}];
[MWMStorage cancelDownloadNode:parentCountryId];
}
[Statistics logEvent:kStatDownloaderMapAction
withParameters:@{
kStatAction : kStatDownload,
kStatIsAuto : kStatNo,
kStatFrom : kStatDownloader,
kStatScenario : kStatDownloadGroup
}];
[MWMStorage downloadNode:parentCountryId
alertController:self.alertController
onSuccess:nil];
}
self.skipCountryEventProcessing = NO;
[self processCountryEvent:parentCountryId];
}
- (IBAction)allMapsCancelAction
{
self.skipCountryEventProcessing = YES;
[Statistics logEvent:kStatDownloaderMapAction
withParameters:@{
kStatAction : kStatCancel,
kStatIsAuto : kStatNo,
kStatFrom : kStatDownloader,
kStatScenario : kStatDownloadGroup
}];
TCountryId const parentCountryId = self.parentCountryId.UTF8String;
[MWMStorage cancelDownloadNode:parentCountryId];
self.skipCountryEventProcessing = NO;
[self processCountryEvent:parentCountryId];
}
#pragma mark - Countries tree(s) navigation
- (void)openAvailableMaps
@ -673,10 +698,10 @@ using namespace storage;
self.dataSource = self.defaultDataSource;
}
- (void)setShowAllMapsView:(BOOL)showAllMapsView
- (void)setShowAllMapsButtons:(BOOL)showAllMapsButtons
{
_showAllMapsView = showAllMapsView;
self.allMapsView.hidden = !showAllMapsView;
_showAllMapsButtons = showAllMapsButtons;
self.allMapsView.hidden = !showAllMapsButtons;
}
- (NSString *)parentCountryId

View file

@ -27,6 +27,8 @@ using namespace storage;
@property (nonatomic, readonly) NSString * parentCountryId;
@property (nonatomic, readonly) TMWMMapDownloaderMode mode;
@property (nonatomic) BOOL showAllMapsButtons;
- (void)configViews;
- (void)openAvailableMaps;
@ -97,28 +99,12 @@ using namespace storage;
}
else
{
self.showAllMapsView = NO;
self.showAllMapsButtons = NO;
self.tableView.hidden = YES;
self.noMapsContainer.hidden = NO;
}
}
#pragma mark - All Maps Action
- (void)configAllMapsView
{
self.showAllMapsView = NO;
auto const & s = GetFramework().Storage();
Storage::UpdateInfo updateInfo{};
if (!s.GetUpdateInfo(s.GetRootId(), updateInfo) || updateInfo.m_numberOfMwmFilesToUpdate == 0)
return;
self.allMapsLabel.text =
[NSString stringWithFormat:@"%@: %@ (%@)", L(@"downloader_outdated_maps"),
@(updateInfo.m_numberOfMwmFilesToUpdate),
formattedSize(updateInfo.m_totalUpdateSizeInBytes)];
self.showAllMapsView = YES;
}
#pragma mark - UISearchBarDelegate
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

View file

@ -1902,46 +1902,53 @@
<constraint firstAttribute="height" constant="1" id="6LI-Em-15P"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="5 Outdated Maps (108 MB)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="464" translatesAutoresizingMaskIntoConstraints="NO" id="VGz-7h-6K5">
<rect key="frame" x="16" y="14" width="444" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GN0-2F-Ytz" customClass="MWMButton">
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
<color key="backgroundColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
<state key="normal" title="Update All">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
</userDefinedRuntimeAttributes>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GN0-2F-Ytz">
<rect key="frame" x="460" y="0.0" width="140" height="44"/>
<constraints>
<constraint firstAttribute="width" constant="140" id="ker-jb-D1t"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<state key="normal" title="Update All"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="downloader_update_all_button"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
<userDefinedRuntimeAttribute type="string" keyPath="coloringName" value="MWMWhite"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="allMapsAction" destination="h4a-ne-bSJ" eventType="touchUpInside" id="swH-BL-Egj"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bQM-6x-WHa" customClass="MWMButton">
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<state key="normal" title="Update All">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="red"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="allMapsCancelAction" destination="h4a-ne-bSJ" eventType="touchUpInside" id="UOO-Sn-8Cf"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="GN0-2F-Ytz" secondAttribute="bottom" id="1d7-Jm-x6G"/>
<constraint firstAttribute="trailing" secondItem="GN0-2F-Ytz" secondAttribute="trailing" id="Fla-om-Cu2"/>
<constraint firstAttribute="bottom" secondItem="bQM-6x-WHa" secondAttribute="bottom" id="GhH-Ej-y9d"/>
<constraint firstItem="GN0-2F-Ytz" firstAttribute="top" secondItem="st5-ZJ-F0A" secondAttribute="top" id="JFl-uF-Jcg"/>
<constraint firstItem="GN0-2F-Ytz" firstAttribute="leading" secondItem="VGz-7h-6K5" secondAttribute="trailing" id="MKo-d0-s9t"/>
<constraint firstItem="VGz-7h-6K5" firstAttribute="leading" secondItem="st5-ZJ-F0A" secondAttribute="leading" constant="16" id="NSY-0Y-fsn"/>
<constraint firstItem="0aj-pt-FjD" firstAttribute="leading" secondItem="st5-ZJ-F0A" secondAttribute="leading" id="T1h-9e-CHh"/>
<constraint firstItem="GN0-2F-Ytz" firstAttribute="centerY" secondItem="st5-ZJ-F0A" secondAttribute="centerY" id="TYj-uT-caw"/>
<constraint firstAttribute="trailing" secondItem="0aj-pt-FjD" secondAttribute="trailing" id="X27-uq-GY8"/>
<constraint firstItem="bQM-6x-WHa" firstAttribute="leading" secondItem="st5-ZJ-F0A" secondAttribute="leading" id="YLa-6K-Khm"/>
<constraint firstItem="0aj-pt-FjD" firstAttribute="top" secondItem="st5-ZJ-F0A" secondAttribute="top" id="k6u-bm-1dm"/>
<constraint firstItem="bQM-6x-WHa" firstAttribute="top" secondItem="st5-ZJ-F0A" secondAttribute="top" id="lgd-lj-2Qq"/>
<constraint firstItem="GN0-2F-Ytz" firstAttribute="leading" secondItem="st5-ZJ-F0A" secondAttribute="leading" id="nUN-rN-AXo"/>
<constraint firstAttribute="trailing" secondItem="bQM-6x-WHa" secondAttribute="trailing" id="pIt-FK-n43"/>
<constraint firstAttribute="height" constant="44" id="r0c-5a-Stj"/>
<constraint firstItem="VGz-7h-6K5" firstAttribute="centerY" secondItem="st5-ZJ-F0A" secondAttribute="centerY" id="r2v-H3-L2q"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
@ -2020,7 +2027,8 @@
</userDefinedRuntimeAttributes>
</view>
<connections>
<outlet property="allMapsLabel" destination="VGz-7h-6K5" id="eoI-x5-VSc"/>
<outlet property="allMapsButton" destination="GN0-2F-Ytz" id="Oi0-99-SSP"/>
<outlet property="allMapsCancelButton" destination="bQM-6x-WHa" id="GhS-AQ-EZd"/>
<outlet property="allMapsView" destination="st5-ZJ-F0A" id="KAY-Rx-kCC"/>
<outlet property="allMapsViewBottomOffset" destination="wj3-ZU-xMA" id="jfn-W1-TEn"/>
<outlet property="noMapsContainer" destination="kXO-Oh-2vO" id="fpe-Gj-ZmD"/>
@ -2072,45 +2080,53 @@
<constraint firstAttribute="height" constant="1" id="77N-Bp-ThF"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="14 Maps (291 MB)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="464" translatesAutoresizingMaskIntoConstraints="NO" id="ks9-BF-szs">
<rect key="frame" x="16" y="14" width="444" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xL5-0u-TaG" customClass="MWMButton">
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
<color key="backgroundColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
<state key="normal" title="Download All">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
</userDefinedRuntimeAttributes>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xL5-0u-TaG">
<rect key="frame" x="460" y="0.0" width="140" height="44"/>
<constraints>
<constraint firstAttribute="width" constant="140" id="Fbl-8r-jNo"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<state key="normal" title="Download All"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
<userDefinedRuntimeAttribute type="string" keyPath="coloringName" value="MWMWhite"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="allMapsAction" destination="ccD-FK-8j5" eventType="touchUpInside" id="EtQ-2G-MEd"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="MmB-HW-cD5" customClass="MWMButton">
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<state key="normal" title="Download All">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="red"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="allMapsCancelAction" destination="ccD-FK-8j5" eventType="touchUpInside" id="Wob-NQ-ZJX"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="C2D-Ac-wjh" firstAttribute="leading" secondItem="9vd-CW-37q" secondAttribute="leading" id="00a-wh-BaK"/>
<constraint firstItem="xL5-0u-TaG" firstAttribute="top" secondItem="9vd-CW-37q" secondAttribute="top" id="6ui-Df-HR9"/>
<constraint firstItem="xL5-0u-TaG" firstAttribute="centerY" secondItem="9vd-CW-37q" secondAttribute="centerY" id="8ea-Gk-AzX"/>
<constraint firstItem="ks9-BF-szs" firstAttribute="leading" secondItem="9vd-CW-37q" secondAttribute="leading" constant="16" id="AhA-nC-yx9"/>
<constraint firstItem="MmB-HW-cD5" firstAttribute="leading" secondItem="9vd-CW-37q" secondAttribute="leading" id="Dh1-Fr-eWw"/>
<constraint firstAttribute="height" constant="44" id="Dow-HV-Frg"/>
<constraint firstItem="ks9-BF-szs" firstAttribute="centerY" secondItem="9vd-CW-37q" secondAttribute="centerY" id="KfJ-Rr-IJu"/>
<constraint firstItem="xL5-0u-TaG" firstAttribute="leading" secondItem="ks9-BF-szs" secondAttribute="trailing" id="UiT-gI-4fB"/>
<constraint firstItem="xL5-0u-TaG" firstAttribute="leading" secondItem="9vd-CW-37q" secondAttribute="leading" id="EdJ-xv-Ddl"/>
<constraint firstAttribute="bottom" secondItem="MmB-HW-cD5" secondAttribute="bottom" id="M2K-ym-QIN"/>
<constraint firstAttribute="trailing" secondItem="MmB-HW-cD5" secondAttribute="trailing" id="Qpf-le-AUb"/>
<constraint firstAttribute="trailing" secondItem="C2D-Ac-wjh" secondAttribute="trailing" id="ZvS-18-Itc"/>
<constraint firstItem="C2D-Ac-wjh" firstAttribute="top" secondItem="9vd-CW-37q" secondAttribute="top" id="aCR-gV-D3e"/>
<constraint firstAttribute="trailing" secondItem="xL5-0u-TaG" secondAttribute="trailing" id="gm9-AZ-44g"/>
<constraint firstAttribute="bottom" secondItem="xL5-0u-TaG" secondAttribute="bottom" id="rd1-SA-czc"/>
<constraint firstItem="MmB-HW-cD5" firstAttribute="top" secondItem="9vd-CW-37q" secondAttribute="top" id="xAU-rg-nW4"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
@ -2169,7 +2185,7 @@
</view>
<connections>
<outlet property="allMapsButton" destination="xL5-0u-TaG" id="09K-th-orY"/>
<outlet property="allMapsLabel" destination="ks9-BF-szs" id="fWQ-TU-r6w"/>
<outlet property="allMapsCancelButton" destination="MmB-HW-cD5" id="wsr-lk-f32"/>
<outlet property="allMapsView" destination="9vd-CW-37q" id="XZs-Bj-AmZ"/>
<outlet property="allMapsViewBottomOffset" destination="Vzi-ku-bUf" id="jSf-BP-6Ii"/>
<outlet property="tableView" destination="bgs-Kf-cQA" id="Nri-qd-wNS"/>