summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Rex <julian.rex@mapbox.com>2019-02-04 10:33:06 -0500
committerJulian Rex <julian.rex@mapbox.com>2019-02-05 12:28:43 -0500
commita4a4f6ec8dba854c0f493ecce3bce87aa5b393ad (patch)
tree875553d90445741c91e45f1f7aa89dd0aa9a7d84
parent47852b6c42b7884dbb7ad107a112c7e0d9f96ed0 (diff)
downloadqtlocation-mapboxgl-upstream/jrex/revert-13556.tar.gz
Revert "[ios] Enable customize positions of mapview ornaments (#13556)"upstream/jrex/revert-13556
This reverts commit e22d28c285c1543ebbf75d205f0129e74b0fbb8a.
-rw-r--r--platform/ios/CHANGELOG.md4
-rw-r--r--platform/ios/app/MBXOrnamentsViewController.h5
-rw-r--r--platform/ios/app/MBXOrnamentsViewController.m93
-rw-r--r--platform/ios/app/MBXViewController.m11
-rw-r--r--platform/ios/ios.xcodeproj/project.pbxproj18
-rw-r--r--platform/ios/sdk-files.json2
-rw-r--r--platform/ios/src/MGLMapView.h59
-rw-r--r--platform/ios/src/MGLMapView.mm347
-rw-r--r--platform/ios/src/MGLScaleBar.mm21
-rw-r--r--platform/ios/src/UIView+MGLAdditions.h19
-rw-r--r--platform/ios/src/UIView+MGLAdditions.m69
-rw-r--r--platform/ios/test/MGLMapViewLayoutTests.m157
12 files changed, 222 insertions, 583 deletions
diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md
index 61ecc4f5e7..cfbb3ac350 100644
--- a/platform/ios/CHANGELOG.md
+++ b/platform/ios/CHANGELOG.md
@@ -59,10 +59,6 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
* `MGLMapSnapshotter` now respects the `MGLIdeographicFontFamilyName` key in Info.plist, which reduces bandwidth consumption when snapshotting regions that contain Chinese or Japanese characters. ([#13427](https://github.com/mapbox/mapbox-gl-native/pull/13427))
* Fixed a sporadic crash when using `MGLMapSnapshotter`. ([#13300](https://github.com/mapbox/mapbox-gl-native/pull/13300))
-### User interaction
-
-* Added options to customize position of scale bar, compass, logo and attribution. ([#13556](https://github.com/mapbox/mapbox-gl-native/pull/13556))
-
### Other changes
* Modified the behavior of the map view so that programmatic camera transitions can no longer be interrupted by user interaction when `MGLMapView.zoomEnabled`, `MGLMapView.rotateEnabled`, `MGLMapView.scrollEnabled`, and `MGLMapView.pitchEnabled` are set to false. ([#13362](https://github.com/mapbox/mapbox-gl-native/pull/13362))
diff --git a/platform/ios/app/MBXOrnamentsViewController.h b/platform/ios/app/MBXOrnamentsViewController.h
deleted file mode 100644
index 087101cdc0..0000000000
--- a/platform/ios/app/MBXOrnamentsViewController.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <UIKit/UIKit.h>
-
-@interface MBXOrnamentsViewController : UIViewController
-
-@end
diff --git a/platform/ios/app/MBXOrnamentsViewController.m b/platform/ios/app/MBXOrnamentsViewController.m
deleted file mode 100644
index 5e575f8c7d..0000000000
--- a/platform/ios/app/MBXOrnamentsViewController.m
+++ /dev/null
@@ -1,93 +0,0 @@
-#import "MBXOrnamentsViewController.h"
-
-@import Mapbox;
-
-@interface MBXOrnamentsViewController ()<MGLMapViewDelegate>
-
-@property (nonatomic) MGLMapView *mapView;
-@property (nonatomic) NSTimer *timer;
-@property (nonatomic) NSInteger currentPositionIndex;
-
-@end
-
-@implementation MBXOrnamentsViewController
-
-- (void)setCurrentPositionIndex:(NSInteger)currentPositionIndex {
- NSArray *ornamentPositions = @[@[
- @(MGLOrnamentPositionTopLeft),
- @(MGLOrnamentPositionTopRight),
- @(MGLOrnamentPositionBottomRight),
- @(MGLOrnamentPositionBottomLeft)
- ],
- @[
- @(MGLOrnamentPositionTopRight),
- @(MGLOrnamentPositionBottomRight),
- @(MGLOrnamentPositionBottomLeft),
- @(MGLOrnamentPositionTopLeft)
- ],
- @[
- @(MGLOrnamentPositionBottomRight),
- @(MGLOrnamentPositionBottomLeft),
- @(MGLOrnamentPositionTopLeft),
- @(MGLOrnamentPositionTopRight)
- ],
- @[
- @(MGLOrnamentPositionBottomLeft),
- @(MGLOrnamentPositionTopLeft),
- @(MGLOrnamentPositionTopRight),
- @(MGLOrnamentPositionBottomRight)
- ],
- @[
- @(MGLOrnamentPositionTopLeft),
- @(MGLOrnamentPositionTopRight),
- @(MGLOrnamentPositionBottomRight),
- @(MGLOrnamentPositionBottomLeft)
- ],
- ];
- NSArray *currentPosition = ornamentPositions[currentPositionIndex];
- self.mapView.scaleBarPosition = [currentPosition[0] integerValue];
- self.mapView.compassViewPosition = [currentPosition[1] integerValue];
- self.mapView.logoViewPosition = [currentPosition[2] integerValue];
- self.mapView.attributionButtonPosition = [currentPosition[3] integerValue];
-
- _currentPositionIndex = currentPositionIndex;
-}
-
-- (void)viewDidLoad {
- [super viewDidLoad];
- self.title = @"Ornaments";
-
- MGLMapView *mapView = [[MGLMapView alloc] initWithFrame:self.view.frame];
- mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- [mapView setCenterCoordinate:CLLocationCoordinate2DMake(39.915143, 116.404053)
- zoomLevel:16
- direction:30
- animated:NO];
- mapView.delegate = self;
- mapView.showsScale = YES;
- [self.view addSubview:mapView];
-
- self.mapView = mapView;
-}
-
-- (void)viewDidDisappear:(BOOL)animated {
- [self.timer invalidate];
- self.timer = nil;
-}
-
-- (void)viewDidAppear:(BOOL)animated {
- self.timer = [NSTimer scheduledTimerWithTimeInterval:1
- target:self
- selector:@selector(onTimerTick)
- userInfo:nil
- repeats:YES];
-}
-
-- (void)onTimerTick {
- self.currentPositionIndex ++;
- if (self.currentPositionIndex >= 4) {
- self.currentPositionIndex = 0;
- }
-}
-
-@end
diff --git a/platform/ios/app/MBXViewController.m b/platform/ios/app/MBXViewController.m
index 9c506cadfa..b2c6ca26b3 100644
--- a/platform/ios/app/MBXViewController.m
+++ b/platform/ios/app/MBXViewController.m
@@ -7,7 +7,6 @@
#import "MBXUserLocationAnnotationView.h"
#import "LimeGreenStyleLayer.h"
#import "MBXEmbeddedMapViewController.h"
-#import "MBXOrnamentsViewController.h"
#import "MBXFrameTimeGraphView.h"
@@ -105,9 +104,8 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
MBXSettingsMiscellaneousShowSnapshots,
MBXSettingsMiscellaneousShouldLimitCameraChanges,
MBXSettingsMiscellaneousShowCustomLocationManager,
- MBXSettingsMiscellaneousOrnamentsPlacement,
MBXSettingsMiscellaneousPrintLogFile,
- MBXSettingsMiscellaneousDeleteLogFile
+ MBXSettingsMiscellaneousDeleteLogFile,
};
// Utility methods
@@ -501,7 +499,6 @@ CLLocationCoordinate2D randomWorldCoordinate() {
@"Show Snapshots",
[NSString stringWithFormat:@"%@ Camera Changes", (_shouldLimitCameraChanges ? @"Unlimit" : @"Limit")],
@"View Route Simulation",
- @"Ornaments Placement",
]];
if (self.debugLoggingEnabled)
@@ -759,12 +756,6 @@ CLLocationCoordinate2D randomWorldCoordinate() {
}
break;
}
- case MBXSettingsMiscellaneousOrnamentsPlacement:
- {
- MBXOrnamentsViewController *ornamentsViewController = [[MBXOrnamentsViewController alloc] init];
- [self.navigationController pushViewController:ornamentsViewController animated:YES];
- break;
- }
default:
NSAssert(NO, @"All miscellaneous setting rows should be implemented");
break;
diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj
index 34cd19a16f..2857d503bb 100644
--- a/platform/ios/ios.xcodeproj/project.pbxproj
+++ b/platform/ios/ios.xcodeproj/project.pbxproj
@@ -347,11 +347,6 @@
55E5666D21C2A2080008B8B5 /* NSData+MMEGZIP.h in Headers */ = {isa = PBXBuildFile; fileRef = 40834BCF1FE05D7100C1BD0D /* NSData+MMEGZIP.h */; };
632281DF1E6F855900D75A5D /* MBXEmbeddedMapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 632281DE1E6F855900D75A5D /* MBXEmbeddedMapViewController.m */; };
6407D6701E0085FD00F6A9C3 /* MGLDocumentationExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6407D66F1E0085FD00F6A9C3 /* MGLDocumentationExampleTests.swift */; };
- 6F018BAE220031B8003E7269 /* UIView+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FAFA29B220023840088709E /* UIView+MGLAdditions.m */; };
- 6F018BAF220031BF003E7269 /* UIView+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FAFA29A220023840088709E /* UIView+MGLAdditions.h */; };
- 6F018BB0220031BF003E7269 /* UIView+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FAFA29A220023840088709E /* UIView+MGLAdditions.h */; };
- 6F018BB1220031C1003E7269 /* UIView+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FAFA29B220023840088709E /* UIView+MGLAdditions.m */; };
- 6FA9341721EF372100AA9CA8 /* MBXOrnamentsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FA9341521EF372100AA9CA8 /* MBXOrnamentsViewController.m */; };
74CB5EB1219B252C00102936 /* MGLStyleLayerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 74CB5EAF219B252C00102936 /* MGLStyleLayerManager.h */; };
74CB5EB2219B252C00102936 /* MGLStyleLayerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 74CB5EAF219B252C00102936 /* MGLStyleLayerManager.h */; };
74CB5EB3219B252C00102936 /* MGLStyleLayerManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 74CB5EB0219B252C00102936 /* MGLStyleLayerManager.mm */; };
@@ -1077,10 +1072,6 @@
632281DD1E6F855900D75A5D /* MBXEmbeddedMapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBXEmbeddedMapViewController.h; sourceTree = "<group>"; };
632281DE1E6F855900D75A5D /* MBXEmbeddedMapViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBXEmbeddedMapViewController.m; sourceTree = "<group>"; };
6407D66F1E0085FD00F6A9C3 /* MGLDocumentationExampleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MGLDocumentationExampleTests.swift; path = ../../darwin/test/MGLDocumentationExampleTests.swift; sourceTree = "<group>"; };
- 6FA9341521EF372100AA9CA8 /* MBXOrnamentsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBXOrnamentsViewController.m; sourceTree = "<group>"; };
- 6FA9341621EF372100AA9CA8 /* MBXOrnamentsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBXOrnamentsViewController.h; sourceTree = "<group>"; };
- 6FAFA29A220023840088709E /* UIView+MGLAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+MGLAdditions.h"; sourceTree = "<group>"; };
- 6FAFA29B220023840088709E /* UIView+MGLAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+MGLAdditions.m"; sourceTree = "<group>"; };
74CB5EAF219B252C00102936 /* MGLStyleLayerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLStyleLayerManager.h; sourceTree = "<group>"; };
74CB5EB0219B252C00102936 /* MGLStyleLayerManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLStyleLayerManager.mm; sourceTree = "<group>"; };
74CB5EB5219B280300102936 /* MGLHillshadeStyleLayer_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLHillshadeStyleLayer_Private.h; sourceTree = "<group>"; };
@@ -1680,8 +1671,6 @@
30E578121DAA7D690050F07E /* UIImage+MGLAdditions.mm */,
DD9BE4F51EB263C50079A3AF /* UIViewController+MGLAdditions.h */,
DD9BE4F61EB263C50079A3AF /* UIViewController+MGLAdditions.m */,
- 6FAFA29A220023840088709E /* UIView+MGLAdditions.h */,
- 6FAFA29B220023840088709E /* UIView+MGLAdditions.m */,
);
name = Categories;
sourceTree = "<group>";
@@ -1953,8 +1942,6 @@
965DF51020F9430500438AAC /* MBXFrameTimeGraphView.m */,
632281DD1E6F855900D75A5D /* MBXEmbeddedMapViewController.h */,
632281DE1E6F855900D75A5D /* MBXEmbeddedMapViewController.m */,
- 6FA9341621EF372100AA9CA8 /* MBXOrnamentsViewController.h */,
- 6FA9341521EF372100AA9CA8 /* MBXOrnamentsViewController.m */,
DA821D051CCC6D59007508D4 /* Main.storyboard */,
DA821D041CCC6D59007508D4 /* LaunchScreen.storyboard */,
DA1DC99E1CB6E088006E619F /* Assets.xcassets */,
@@ -2426,7 +2413,6 @@
35E79F201D41266300957B9E /* MGLStyleLayer_Private.h in Headers */,
FA68F14A1E9D656600F9F6C2 /* MGLFillExtrusionStyleLayer.h in Headers */,
353933FB1D3FB7C0003F57D7 /* MGLRasterStyleLayer.h in Headers */,
- 6F018BB0220031BF003E7269 /* UIView+MGLAdditions.h in Headers */,
1FCAE2A820B88B3800C577DD /* MGLLocationManager_Private.h in Headers */,
DA8847EF1CBAFA5100AB86E3 /* MGLAccountManager.h in Headers */,
DA35A2C91CCAAAD200E826B2 /* NSValue+MGLAdditions.h in Headers */,
@@ -2634,7 +2620,6 @@
3510FFEB1D6D9C7A00F413B2 /* NSComparisonPredicate+MGLAdditions.h in Headers */,
35E1A4D91D74336F007AA97F /* MGLValueEvaluator.h in Headers */,
DABFB8701CBE9A0F00D62B32 /* MGLMapView+IBAdditions.h in Headers */,
- 6F018BAF220031BF003E7269 /* UIView+MGLAdditions.h in Headers */,
96E516EA2000560B00A02306 /* MGLAnnotationView_Private.h in Headers */,
96E516FB20005A4000A02306 /* MGLUserLocationHeadingBeamLayer.h in Headers */,
96E516DC2000547000A02306 /* MGLPolyline_Private.h in Headers */,
@@ -3088,7 +3073,6 @@
354B839C1D2E9B48005D9406 /* MBXUserLocationAnnotationView.m in Sources */,
965DF51120F9430500438AAC /* MBXFrameTimeGraphView.m in Sources */,
DA1DC9991CB6E054006E619F /* MBXAppDelegate.m in Sources */,
- 6FA9341721EF372100AA9CA8 /* MBXOrnamentsViewController.m in Sources */,
DA1DC96B1CB6C6B7006E619F /* MBXOfflinePacksTableViewController.m in Sources */,
DA1DC96A1CB6C6B7006E619F /* MBXCustomCalloutView.m in Sources */,
927FBCFC1F4DAA8300F8BF1F /* MBXSnapshotsViewController.m in Sources */,
@@ -3188,7 +3172,6 @@
40834C4A1FE05F7500C1BD0D /* TSKPinningValidator.m in Sources */,
967C864D210A9D3C004DF794 /* UIDevice+MGLAdditions.m in Sources */,
400533021DB0862B0069F638 /* NSArray+MGLAdditions.mm in Sources */,
- 6F018BAE220031B8003E7269 /* UIView+MGLAdditions.m in Sources */,
96036A03200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */,
ACA65F592140697200537748 /* MMEDispatchManager.m in Sources */,
40834BF31FE05E1800C1BD0D /* MMETimerManager.m in Sources */,
@@ -3324,7 +3307,6 @@
35136D431D42274500C20EFD /* MGLRasterStyleLayer.mm in Sources */,
967C864E210A9D3C004DF794 /* UIDevice+MGLAdditions.m in Sources */,
96036A04200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */,
- 6F018BB1220031C1003E7269 /* UIView+MGLAdditions.m in Sources */,
40834C071FE05E1800C1BD0D /* MMETimerManager.m in Sources */,
ACA65F5A2140697200537748 /* MMEDispatchManager.m in Sources */,
3538AA201D542239008EC33D /* MGLForegroundStyleLayer.mm in Sources */,
diff --git a/platform/ios/sdk-files.json b/platform/ios/sdk-files.json
index 8f17d7264f..0bf09e48fa 100644
--- a/platform/ios/sdk-files.json
+++ b/platform/ios/sdk-files.json
@@ -30,7 +30,6 @@
"platform/ios/vendor/mapbox-events-ios/vendor/TrustKit/TSKPinningValidator.m",
"platform/ios/src/UIDevice+MGLAdditions.m",
"platform/darwin/src/NSArray+MGLAdditions.mm",
- "platform/ios/src/UIView+MGLAdditions.m",
"platform/ios/src/NSOrthography+MGLAdditions.m",
"platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEDispatchManager.m",
"platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMETimerManager.m",
@@ -233,7 +232,6 @@
"MGLShape_Private.h": "platform/darwin/src/MGLShape_Private.h",
"MGLPolygon_Private.h": "platform/darwin/src/MGLPolygon_Private.h",
"MGLStyleLayer_Private.h": "platform/darwin/src/MGLStyleLayer_Private.h",
- "UIView+MGLAdditions.h": "platform/ios/src/UIView+MGLAdditions.h",
"MGLLocationManager_Private.h": "platform/darwin/src/MGLLocationManager_Private.h",
"MGLLoggingConfiguration_Private.h": "platform/darwin/src/MGLLoggingConfiguration_Private.h",
"NSComparisonPredicate+MGLAdditions.h": "platform/darwin/src/NSComparisonPredicate+MGLAdditions.h",
diff --git a/platform/ios/src/MGLMapView.h b/platform/ios/src/MGLMapView.h
index 7980d6aaf5..5930dc98c1 100644
--- a/platform/ios/src/MGLMapView.h
+++ b/platform/ios/src/MGLMapView.h
@@ -49,24 +49,6 @@ typedef NS_ENUM(NSUInteger, MGLAnnotationVerticalAlignment) {
};
/**
- The position of scale bar, compass, logo and attribution in a map view. Used with
- `MGLMapView.scaleBarPosition`,
- `MGLMapView.compassViewPosition`,
- `MGLMapView.logoViewPosition`,
- `MGLMapView.attributionButtonPosition`.
- */
-typedef NS_ENUM(NSUInteger, MGLOrnamentPosition) {
- /** Place the ornament in the top left of the map view. */
- MGLOrnamentPositionTopLeft = 0,
- /** Place the ornament in the top right of the map view. */
- MGLOrnamentPositionTopRight,
- /** Place the ornament in the bottom left of the map view. */
- MGLOrnamentPositionBottomLeft,
- /** Place the ornament in the bottom right of the map view. */
- MGLOrnamentPositionBottomRight,
-};
-
-/**
The mode used to track the user location on the map. Used with
`MGLMapView.userTrackingMode`.
@@ -305,32 +287,12 @@ MGL_EXPORT IB_DESIGNABLE
@property (nonatomic, readonly) UIView *scaleBar;
/**
- The postion of the scale bar. The default value is `MGLOrnamentPositionTopLeft`.
- */
-@property (nonatomic, assign) MGLOrnamentPosition scaleBarPosition;
-
-/**
- A `CGPoint` indicating the position offset of the scale bar.
- */
-@property (nonatomic, assign) CGPoint scaleBarOffset;
-
-/**
A control indicating the map’s direction and allowing the user to manipulate
the direction, positioned in the upper-right corner.
*/
@property (nonatomic, readonly) UIImageView *compassView;
/**
- The postion of the compass view. The default value is `MGLOrnamentPositionTopRight`.
- */
-@property (nonatomic, assign) MGLOrnamentPosition compassViewPosition;
-
-/**
- A `CGPoint` indicating the position offset of the compass.
- */
-@property (nonatomic, assign) CGPoint compassViewOffset;
-
-/**
The Mapbox logo, positioned in the lower-left corner.
@note The Mapbox terms of service, which governs the use of Mapbox-hosted
@@ -342,17 +304,6 @@ MGL_EXPORT IB_DESIGNABLE
@property (nonatomic, readonly) UIImageView *logoView;
/**
- The postion of the logo view. The default value is `MGLOrnamentPositionBottomLeft`.
- */
-@property (nonatomic, assign) MGLOrnamentPosition logoViewPosition;
-
-/**
- A `CGPoint` indicating the position offset of the logo.
- */
-@property (nonatomic, assign) CGPoint logoViewOffset;
-
-
-/**
A view showing legally required copyright notices and telemetry settings,
positioned at the bottom-right of the map view.
@@ -378,16 +329,6 @@ MGL_EXPORT IB_DESIGNABLE
@property (nonatomic, readonly) UIButton *attributionButton;
/**
- The postion of the attribution button. The default value is `MGLOrnamentPositionBottomRight`.
- */
-@property (nonatomic, assign) MGLOrnamentPosition attributionButtonPosition;
-
-/**
- A `CGPoint` indicating the position offset of the attribution.
- */
-@property (nonatomic, assign) CGPoint attributionButtonOffset;
-
-/**
Show the attribution and telemetry action sheet.
This action is performed when the user taps on the attribution button provided
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index 9620a9514c..2c10a606c0 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -54,7 +54,6 @@
#import "UIDevice+MGLAdditions.h"
#import "UIImage+MGLAdditions.h"
#import "UIViewController+MGLAdditions.h"
-#import "UIView+MGLAdditions.h"
#import "MGLFaux3DUserLocationAnnotationView.h"
#import "MGLUserLocationAnnotationView.h"
@@ -97,8 +96,6 @@ const MGLExceptionName MGLUserLocationAnnotationTypeException = @"MGLUserLocatio
const MGLExceptionName MGLResourceNotFoundException = @"MGLResourceNotFoundException";
const MGLExceptionName MGLUnderlyingMapUnavailableException = @"MGLUnderlyingMapUnavailableException";
-const CGPoint MGLDefaultOrnamentPositionOffset = CGPointMake(8, 8);
-
/// Indicates the manner in which the map view is tracking the user location.
typedef NS_ENUM(NSUInteger, MGLUserTrackingState) {
/// The map view is not yet tracking the user location.
@@ -514,8 +511,6 @@ public:
_logoView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_logoView];
_logoViewConstraints = [NSMutableArray array];
- _logoViewPosition = MGLOrnamentPositionBottomLeft;
- _logoViewOffset = MGLDefaultOrnamentPositionOffset;
// setup attribution
//
@@ -530,8 +525,6 @@ public:
UILongPressGestureRecognizer *attributionLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(showAttribution:)];
[_attributionButton addGestureRecognizer:attributionLongPress];
- _attributionButtonPosition = MGLOrnamentPositionBottomRight;
- _attributionButtonOffset = MGLDefaultOrnamentPositionOffset;
// setup compass
//
@@ -545,8 +538,6 @@ public:
_compassView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_compassView];
_compassViewConstraints = [NSMutableArray array];
- _compassViewPosition = MGLOrnamentPositionTopRight;
- _compassViewOffset = MGLDefaultOrnamentPositionOffset;
// setup scale control
//
@@ -554,11 +545,7 @@ public:
_scaleBar.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_scaleBar];
_scaleBarConstraints = [NSMutableArray array];
- _scaleBarPosition = MGLOrnamentPositionTopLeft;
- _scaleBarOffset = MGLDefaultOrnamentPositionOffset;
-
- [self installConstraints];
-
+
// setup interaction
//
_pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
@@ -812,134 +799,222 @@ public:
return YES;
}
-- (void)setScaleBarPosition:(MGLOrnamentPosition)scaleBarPosition {
- MGLLogDebug(@"Setting scaleBarPosition: %lu", scaleBarPosition);
- _scaleBarPosition = scaleBarPosition;
- [self installScaleBarConstraints];
-}
-
-- (void)setScaleBarOffset:(CGPoint)scaleBarOffset {
- NSAssert(scaleBarOffset.x >= 0 && scaleBarOffset.y >= 0, @"The position offset of the scale bar should not be negative.");
- MGLLogDebug(@"Setting scaleBarOffset: (x:%f, y:%f)", scaleBarOffset.x, scaleBarOffset.y);
- _scaleBarOffset = scaleBarOffset;
- [self installScaleBarConstraints];
-}
-
-- (void)setCompassViewPosition:(MGLOrnamentPosition)compassViewPosition {
- MGLLogDebug(@"Setting compassViewPosition: %lu", compassViewPosition);
- _compassViewPosition = compassViewPosition;
- [self installCompassViewConstraints];
-}
-
-- (void)setCompassViewOffset:(CGPoint)compassViewOffset {
- NSAssert(compassViewOffset.x >= 0 && compassViewOffset.y >= 0, @"The position offset of the compass should not be negative.");
- MGLLogDebug(@"Setting compassViewOffset: (x:%f, y:%f)", compassViewOffset.x, compassViewOffset.y);
- _compassViewOffset = compassViewOffset;
- [self installCompassViewConstraints];
-}
-
-- (void)setLogoViewPosition:(MGLOrnamentPosition)logoViewPosition {
- MGLLogDebug(@"Setting logoViewPosition: %lu", logoViewPosition);
- _logoViewPosition = logoViewPosition;
- [self installLogoViewConstraints];
-}
-
-- (void)setLogoViewOffset:(CGPoint)logoViewOffset {
- NSAssert(logoViewOffset.x >= 0 && logoViewOffset.y >= 0, @"The position offset of the logo should not be negative.");
- MGLLogDebug(@"Setting logoViewOffset: (x:%f, y:%f)", logoViewOffset.x, logoViewOffset.y);
- _logoViewOffset = logoViewOffset;
- [self installLogoViewConstraints];
-}
-
-- (void)setAttributionButtonPosition:(MGLOrnamentPosition)attributionButtonPosition {
- MGLLogDebug(@"Setting attributionButtonPosition: %lu", attributionButtonPosition);
- _attributionButtonPosition = attributionButtonPosition;
- [self installAttributionButtonConstraints];
-}
-
-- (void)setAttributionButtonOffset:(CGPoint)attributionButtonOffset {
- NSAssert(attributionButtonOffset.x >= 0 && attributionButtonOffset.y >= 0, @"The position offset of the attribution should not be negative.");
- MGLLogDebug(@"Setting attributionButtonOffset: (x:%f, y:%f)", attributionButtonOffset.x, attributionButtonOffset.y);
- _attributionButtonOffset = attributionButtonOffset;
- [self installAttributionButtonConstraints];
-}
-
-- (void)installConstraintsWithView:(UIView *)view
- constraints:(NSMutableArray *)constraints
- position:(MGLOrnamentPosition)position
- size:(CGSize)size
- offset:(CGPoint)offset {
- NSMutableArray *updatedConstraints = [NSMutableArray array];
-
- switch (position) {
- case MGLOrnamentPositionTopLeft:
- [updatedConstraints addObject:[view.topAnchor constraintEqualToAnchor:self.mgl_safeTopAnchor constant:offset.y]];
- [updatedConstraints addObject:[view.leadingAnchor constraintEqualToAnchor:self.mgl_safeLeadingAnchor constant:offset.x]];
- break;
- case MGLOrnamentPositionTopRight:
- [updatedConstraints addObject:[view.topAnchor constraintEqualToAnchor:self.mgl_safeTopAnchor constant:offset.y]];
- [updatedConstraints addObject:[self.mgl_safeTrailingAnchor constraintEqualToAnchor:view.trailingAnchor constant:offset.x]];
- break;
- case MGLOrnamentPositionBottomLeft:
- [updatedConstraints addObject:[self.mgl_safeBottomAnchor constraintEqualToAnchor:view.bottomAnchor constant:offset.y]];
- [updatedConstraints addObject:[view.leadingAnchor constraintEqualToAnchor:self.mgl_safeLeadingAnchor constant:offset.x]];
- break;
- case MGLOrnamentPositionBottomRight:
- [updatedConstraints addObject:[self.mgl_safeBottomAnchor constraintEqualToAnchor:view.bottomAnchor constant:offset.y]];
- [updatedConstraints addObject: [self.mgl_safeTrailingAnchor constraintEqualToAnchor:view.trailingAnchor constant:offset.x]];
- break;
- default:
- break;
- }
-
- [NSLayoutConstraint deactivateConstraints:constraints];
- [constraints removeAllObjects];
- [NSLayoutConstraint activateConstraints:updatedConstraints];
- [constraints addObjectsFromArray:updatedConstraints];
-}
-
-- (void)installConstraints
+- (UIViewController *)viewControllerForLayoutGuides
{
- [self installCompassViewConstraints];
- [self installScaleBarConstraints];
- [self installLogoViewConstraints];
- [self installAttributionButtonConstraints];
+ // Per -[UIResponder nextResponder] documentation, a UIView’s next responder
+ // is its managing UIViewController if applicable, or otherwise its
+ // superview. UIWindow’s next responder is UIApplication, which has no next
+ // responder.
+ UIResponder *laterResponder = self;
+ while ([laterResponder isKindOfClass:[UIView class]])
+ {
+ laterResponder = laterResponder.nextResponder;
+ }
+ if ([laterResponder isKindOfClass:[UIViewController class]])
+ {
+ return (UIViewController *)laterResponder;
+ }
+ return nil;
}
-- (void)installCompassViewConstraints {
+- (void)updateConstraintsPreiOS11 {
+ // If we have a view controller reference and its automaticallyAdjustsScrollViewInsets
+ // is set to YES, use its view as the parent for constraints. -[MGLMapView adjustContentInset]
+ // already take top and bottom layout guides into account. If we don't have a reference, apply
+ // constraints against ourself to maintain placement of the subviews.
+ //
+ UIViewController *viewController = self.viewControllerForLayoutGuides;
+ BOOL useLayoutGuides = viewController.view && viewController.automaticallyAdjustsScrollViewInsets;
+ UIView *containerView = useLayoutGuides ? viewController.view : self;
+
// compass view
- [self installConstraintsWithView:self.compassView
- constraints:self.compassViewConstraints
- position:self.compassViewPosition
- size:self.compassView.bounds.size
- offset:self.compassViewOffset];
-}
-
-- (void)installScaleBarConstraints {
+ //
+ [containerView removeConstraints:self.compassViewConstraints];
+ [self.compassViewConstraints removeAllObjects];
+
+ if (useLayoutGuides) {
+ [self.compassViewConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self.compassView
+ attribute:NSLayoutAttributeTop
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:viewController.topLayoutGuide
+ attribute:NSLayoutAttributeBottom
+ multiplier:1.0
+ constant:8.0]];
+ }
+ [self.compassViewConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self.compassView
+ attribute:NSLayoutAttributeTop
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:self
+ attribute:NSLayoutAttributeTop
+ multiplier:1.0
+ constant:8.0 + self.contentInset.top]];
+
+ [self.compassViewConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self
+ attribute:NSLayoutAttributeTrailing
+ relatedBy:NSLayoutRelationEqual
+ toItem:self.compassView
+ attribute:NSLayoutAttributeTrailing
+ multiplier:1.0
+ constant:8.0 + self.contentInset.right]];
+
+ [containerView addConstraints:self.compassViewConstraints];
+
// scale bar view
- [self installConstraintsWithView:self.scaleBar
- constraints:self.scaleBarConstraints
- position:self.scaleBarPosition
- size:self.scaleBar.intrinsicContentSize
- offset:self.scaleBarOffset];
+ //
+ [containerView removeConstraints:self.scaleBarConstraints];
+ [self.scaleBarConstraints removeAllObjects];
+
+ if (useLayoutGuides) {
+ [self.scaleBarConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self.scaleBar
+ attribute:NSLayoutAttributeTop
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:viewController.topLayoutGuide
+ attribute:NSLayoutAttributeBottom
+ multiplier:1.0
+ constant:8.0]];
+ }
+ [self.scaleBarConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self.scaleBar
+ attribute:NSLayoutAttributeTop
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:self
+ attribute:NSLayoutAttributeTop
+ multiplier:1.0
+ constant:8.0 + self.contentInset.top]];
+ [self.scaleBarConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self.scaleBar
+ attribute:NSLayoutAttributeLeft
+ relatedBy:NSLayoutRelationEqual
+ toItem:self
+ attribute:NSLayoutAttributeLeft
+ multiplier:1.0
+ constant:8.0 + self.contentInset.left]];
+
+ [containerView addConstraints:self.scaleBarConstraints];
+
+ // logo view
+ //
+ [containerView removeConstraints:self.logoViewConstraints];
+ [self.logoViewConstraints removeAllObjects];
+
+ if (useLayoutGuides) {
+ [self.logoViewConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:viewController.bottomLayoutGuide
+ attribute:NSLayoutAttributeTop
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:self.logoView
+ attribute:NSLayoutAttributeBaseline
+ multiplier:1.0
+ constant:8.0 + self.contentInset.bottom]];
+ }
+ [self.logoViewConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self
+ attribute:NSLayoutAttributeBottom
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:self.logoView
+ attribute:NSLayoutAttributeBaseline
+ multiplier:1
+ constant:8.0 + self.contentInset.bottom]];
+ [self.logoViewConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self.logoView
+ attribute:NSLayoutAttributeLeading
+ relatedBy:NSLayoutRelationEqual
+ toItem:self
+ attribute:NSLayoutAttributeLeading
+ multiplier:1.0
+ constant:8.0 + self.contentInset.left]];
+ [containerView addConstraints:self.logoViewConstraints];
+
+ // attribution button
+ //
+ [containerView removeConstraints:self.attributionButtonConstraints];
+ [self.attributionButtonConstraints removeAllObjects];
+
+ if (useLayoutGuides) {
+ [self.attributionButtonConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:viewController.bottomLayoutGuide
+ attribute:NSLayoutAttributeTop
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:self.attributionButton
+ attribute:NSLayoutAttributeBaseline
+ multiplier:1
+ constant:8.0 + self.contentInset.bottom]];
+ }
+ [self.attributionButtonConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self
+ attribute:NSLayoutAttributeBottom
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:self.attributionButton
+ attribute:NSLayoutAttributeBaseline
+ multiplier:1
+ constant:8.0 + self.contentInset.bottom]];
+
+ [self.attributionButtonConstraints addObject:
+ [NSLayoutConstraint constraintWithItem:self
+ attribute:NSLayoutAttributeTrailing
+ relatedBy:NSLayoutRelationEqual
+ toItem:self.attributionButton
+ attribute:NSLayoutAttributeTrailing
+ multiplier:1
+ constant:8.0 + self.contentInset.right]];
+ [containerView addConstraints:self.attributionButtonConstraints];
}
-- (void)installLogoViewConstraints {
- // logo view
- [self installConstraintsWithView:self.logoView
- constraints:self.logoViewConstraints
- position:self.logoViewPosition
- size:self.logoView.bounds.size
- offset:self.logoViewOffset];
+- (void)updateConstraints
+{
+ // If safeAreaLayoutGuide API exists
+ if (@available(iOS 11.0, *)) {
+ UILayoutGuide *safeAreaLayoutGuide = self.safeAreaLayoutGuide;
+
+ // compass view
+ [self removeConstraints:self.compassViewConstraints];
+ [self.compassViewConstraints removeAllObjects];
+ [self.compassViewConstraints addObject:[self constraintForYAxisAnchor:self.compassView.topAnchor belowAnchor:safeAreaLayoutGuide.topAnchor]];
+ [self.compassViewConstraints addObject:[safeAreaLayoutGuide.rightAnchor constraintEqualToAnchor:self.compassView.rightAnchor
+ constant:8.0 + self.contentInset.right]];
+ [self addConstraints:self.compassViewConstraints];
+
+ // scale bar view
+ [self removeConstraints:self.scaleBarConstraints];
+ [self.scaleBarConstraints removeAllObjects];
+ [self.scaleBarConstraints addObject:[self constraintForYAxisAnchor:self.scaleBar.topAnchor belowAnchor:safeAreaLayoutGuide.topAnchor]];
+ [self.scaleBarConstraints addObject:[self.scaleBar.leftAnchor constraintEqualToAnchor:safeAreaLayoutGuide.leftAnchor
+ constant:8.0 + self.contentInset.left]];
+ [self addConstraints:self.scaleBarConstraints];
+
+ // logo view
+ [self removeConstraints:self.logoViewConstraints];
+ [self.logoViewConstraints removeAllObjects];
+ [self.logoViewConstraints addObject:[self constraintForYAxisAnchor:safeAreaLayoutGuide.bottomAnchor belowAnchor:self.logoView.bottomAnchor]];
+ [self.logoViewConstraints addObject:[self.logoView.leftAnchor constraintEqualToAnchor:safeAreaLayoutGuide.leftAnchor
+ constant:8.0 + self.contentInset.left]];
+ [self addConstraints:self.logoViewConstraints];
+
+ // attribution button
+ [self removeConstraints:self.attributionButtonConstraints];
+ [self.attributionButtonConstraints removeAllObjects];
+ [self.attributionButtonConstraints addObject:[self constraintForYAxisAnchor:safeAreaLayoutGuide.bottomAnchor belowAnchor:self.attributionButton.bottomAnchor]];
+ [self.attributionButtonConstraints addObject:[safeAreaLayoutGuide.rightAnchor constraintEqualToAnchor:self.attributionButton.rightAnchor
+ constant:8.0 + self.contentInset.right]];
+ [self addConstraints:self.attributionButtonConstraints];
+ } else {
+ [self updateConstraintsPreiOS11];
+ }
+
+ [super updateConstraints];
}
-- (void)installAttributionButtonConstraints {
- // attribution button
- [self installConstraintsWithView:self.attributionButton
- constraints:self.attributionButtonConstraints
- position:self.attributionButtonPosition
- size:self.attributionButton.bounds.size
- offset:self.attributionButtonOffset];
+- (NSLayoutConstraint *)constraintForYAxisAnchor:(NSLayoutYAxisAnchor *)yAxisAnchor belowAnchor:(NSLayoutYAxisAnchor *)anchor
+{
+ if (@available(iOS 11.0, *)) {
+ return [yAxisAnchor constraintEqualToSystemSpacingBelowAnchor:anchor multiplier:1];
+ } else {
+ return nil;
+ }
}
- (BOOL)isOpaque
@@ -1064,7 +1139,7 @@ public:
}
// Compass, logo and attribution button constraints needs to be updated.
- [self installConstraints];
+ [self setNeedsUpdateConstraints];
}
/// Returns the frame of inset content within the map view.
@@ -1221,7 +1296,6 @@ public:
- (void)didMoveToSuperview
{
[self validateDisplayLink];
- [self installConstraints];
[super didMoveToSuperview];
}
@@ -2506,7 +2580,7 @@ public:
- (CGRect)accessibilityFrame
{
CGRect frame = [super accessibilityFrame];
- UIViewController *viewController = self.mgl_viewControllerForLayoutGuides;
+ UIViewController *viewController = self.viewControllerForLayoutGuides;
if (viewController)
{
CGFloat topInset = viewController.topLayoutGuide.length;
@@ -6308,7 +6382,6 @@ public:
if ( ! self.scaleBar.hidden)
{
[(MGLScaleBar *)self.scaleBar setMetersPerPoint:[self metersPerPointAtLatitude:self.centerCoordinate.latitude]];
- [self installScaleBarConstraints];
}
}
diff --git a/platform/ios/src/MGLScaleBar.mm b/platform/ios/src/MGLScaleBar.mm
index caa5157a49..f17d7b7ad2 100644
--- a/platform/ios/src/MGLScaleBar.mm
+++ b/platform/ios/src/MGLScaleBar.mm
@@ -86,7 +86,7 @@ static const MGLRow MGLImperialTable[] ={
@property (nonatomic, assign) CGFloat borderWidth;
@property (nonatomic) NSCache* labelImageCache;
@property (nonatomic) MGLScaleBarLabel* prototypeLabel;
-@property (nonatomic) CGFloat lastLabelWidth;
+
@end
@@ -94,7 +94,6 @@ static const CGFloat MGLBarHeight = 4;
static const CGFloat MGLFeetPerMeter = 3.28084;
@interface MGLScaleBarLabel : UILabel
-
@end
@implementation MGLScaleBarLabel
@@ -185,7 +184,7 @@ static const CGFloat MGLFeetPerMeter = 3.28084;
#pragma mark - Dimensions
- (CGSize)intrinsicContentSize {
- return CGSizeMake(self.actualWidth + self.lastLabelWidth/2, 16);
+ return CGSizeMake(self.actualWidth, 16);
}
- (CGFloat)actualWidth {
@@ -195,7 +194,8 @@ static const CGFloat MGLFeetPerMeter = 3.28084;
- (CGFloat)maximumWidth {
CGFloat fullWidth = CGRectGetWidth(self.superview.bounds);
- return floorf(fullWidth / 2);
+ CGFloat padding = [self usesRightToLeftLayout] ? fullWidth - CGRectGetMaxX(self.frame) : CGRectGetMinX(self.frame);
+ return floorf(fullWidth / 2 - padding);
}
- (CGFloat)unitsPerPoint {
@@ -256,9 +256,12 @@ static const CGFloat MGLFeetPerMeter = 3.28084;
[self updateVisibility];
self.row = [self preferredRow];
-
+
CGSize size = self.intrinsicContentSize;
- self.bounds = CGRectMake(0, 0, size.width, size.height);
+ self.frame = CGRectMake(CGRectGetMinX(self.frame),
+ CGRectGetMinY(self.frame),
+ size.width,
+ size.height);
}
- (void)updateVisibility {
@@ -368,9 +371,7 @@ static const CGFloat MGLFeetPerMeter = 3.28084;
CLLocationDistance barDistance = multiplier * i;
UIImage *image = [self cachedLabelImageForDistance:barDistance];
- if (i == self.row.numberOfBars) {
- self.lastLabelWidth = image.size.width;
- }
+
labelView.layer.contents = (id)image.CGImage;
labelView.layer.contentsScale = image.scale;
}
@@ -420,7 +421,7 @@ static const CGFloat MGLFeetPerMeter = 3.28084;
}
- (void)layoutLabels {
- CGFloat barWidth = round(self.actualWidth / self.bars.count);
+ CGFloat barWidth = round(self.bounds.size.width / self.bars.count);
BOOL RTL = [self usesRightToLeftLayout];
NSUInteger i = RTL ? self.bars.count : 0;
for (UIView *label in self.labelViews) {
diff --git a/platform/ios/src/UIView+MGLAdditions.h b/platform/ios/src/UIView+MGLAdditions.h
deleted file mode 100644
index 85fea31ad2..0000000000
--- a/platform/ios/src/UIView+MGLAdditions.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#import <UIKit/UIKit.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface UIView (MGLAdditions)
-
-- (UIViewController *)mgl_viewControllerForLayoutGuides;
-
-- (NSLayoutYAxisAnchor *)mgl_safeTopAnchor;
-
-- (NSLayoutXAxisAnchor *)mgl_safeLeadingAnchor;
-
-- (NSLayoutYAxisAnchor *)mgl_safeBottomAnchor;
-
-- (NSLayoutXAxisAnchor *)mgl_safeTrailingAnchor;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/platform/ios/src/UIView+MGLAdditions.m b/platform/ios/src/UIView+MGLAdditions.m
deleted file mode 100644
index 43c54409bd..0000000000
--- a/platform/ios/src/UIView+MGLAdditions.m
+++ /dev/null
@@ -1,69 +0,0 @@
-#import "UIView+MGLAdditions.h"
-
-@implementation UIView (MGLAdditions)
-
-- (UIViewController *)mgl_viewControllerForLayoutGuides
-{
- // Per -[UIResponder nextResponder] documentation, a UIView’s next responder
- // is its managing UIViewController if applicable, or otherwise its
- // superview. UIWindow’s next responder is UIApplication, which has no next
- // responder.
- UIResponder *laterResponder = self;
- while ([laterResponder isKindOfClass:[UIView class]])
- {
- laterResponder = laterResponder.nextResponder;
- }
- if ([laterResponder isKindOfClass:[UIViewController class]])
- {
- return (UIViewController *)laterResponder;
- }
- return nil;
-}
-
-- (NSLayoutYAxisAnchor *)mgl_safeTopAnchor {
- if (@available(iOS 11.0, *)) {
- return self.safeAreaLayoutGuide.topAnchor;
- } else {
- UIViewController *viewController = self.mgl_viewControllerForLayoutGuides;
- BOOL useLayoutGuides = viewController.view && viewController.automaticallyAdjustsScrollViewInsets;
- if (useLayoutGuides) {
- return viewController.topLayoutGuide.bottomAnchor;
- }
- else {
- return self.topAnchor;
- }
- }
-}
-
-- (NSLayoutXAxisAnchor *)mgl_safeLeadingAnchor {
- if (@available(iOS 11.0, *)) {
- return self.safeAreaLayoutGuide.leadingAnchor;
- } else {
- return self.leadingAnchor;
- }
-}
-
-- (NSLayoutYAxisAnchor *)mgl_safeBottomAnchor {
- if (@available(iOS 11.0, *)) {
- return self.safeAreaLayoutGuide.bottomAnchor;
- } else {
- UIViewController *viewController = self.mgl_viewControllerForLayoutGuides;
- BOOL useLayoutGuides = viewController.view && viewController.automaticallyAdjustsScrollViewInsets;
- if (useLayoutGuides) {
- return viewController.bottomLayoutGuide.topAnchor;
- }
- else {
- return self.bottomAnchor;
- }
- }
-}
-
-- (NSLayoutXAxisAnchor *)mgl_safeTrailingAnchor {
- if (@available(iOS 11.0, *)) {
- return self.safeAreaLayoutGuide.trailingAnchor;
- } else {
- return self.trailingAnchor;
- }
-}
-
-@end
diff --git a/platform/ios/test/MGLMapViewLayoutTests.m b/platform/ios/test/MGLMapViewLayoutTests.m
index 452bb203d6..dfae346289 100644
--- a/platform/ios/test/MGLMapViewLayoutTests.m
+++ b/platform/ios/test/MGLMapViewLayoutTests.m
@@ -4,27 +4,6 @@
#import "MGLAccountManager.h"
-@interface MGLOrnamentTestData : NSObject
-
-@property (nonatomic) MGLOrnamentPosition position;
-@property (nonatomic) CGPoint offset;
-@property (nonatomic) CGPoint expectedOrigin;
-
-@end
-
-@implementation MGLOrnamentTestData
-
-+ (instancetype)createWithPostion:(MGLOrnamentPosition)position offset:(CGPoint)offset expectedOrigin:(CGPoint)expectedOrigin {
- MGLOrnamentTestData *data = [[MGLOrnamentTestData alloc] init];
- data.position = position;
- data.offset = offset;
- data.expectedOrigin = expectedOrigin;
- return data;
-}
-
-@end
-
-
@interface MGLMapViewLayoutTests : XCTestCase<MGLMapViewDelegate>
@property (nonatomic) UIView *superView;
@@ -127,140 +106,4 @@
XCTAssertEqualWithAccuracy(CGRectGetMinY(logoView.frame), expectedLogoOriginY, accuracy);
}
-- (void)testOrnamentPlacementInvalidArgument {
- XCTAssertThrows([self.mapView setCompassViewOffset:CGPointMake(-4, -4)]);
- XCTAssertThrows([self.mapView setCompassViewOffset:CGPointMake(-4, 0)]);
- XCTAssertThrows([self.mapView setCompassViewOffset:CGPointMake(0, -4)]);
-
- XCTAssertThrows([self.mapView setScaleBarOffset:CGPointMake(-4, -4)]);
- XCTAssertThrows([self.mapView setScaleBarOffset:CGPointMake(-4, 0)]);
- XCTAssertThrows([self.mapView setScaleBarOffset:CGPointMake(0, -4)]);
-
- XCTAssertThrows([self.mapView setAttributionButtonOffset:CGPointMake(-4, -4)]);
- XCTAssertThrows([self.mapView setAttributionButtonOffset:CGPointMake(-4, 0)]);
- XCTAssertThrows([self.mapView setAttributionButtonOffset:CGPointMake(0, -4)]);
-
- XCTAssertThrows([self.mapView setLogoViewOffset:CGPointMake(-4, -4)]);
- XCTAssertThrows([self.mapView setLogoViewOffset:CGPointMake(-4, 0)]);
- XCTAssertThrows([self.mapView setLogoViewOffset:CGPointMake(0, -4)]);
-}
-
-- (NSArray *)makeTestDataListWithView:(UIView *)view margin:(CGFloat)margin {
- CGFloat bottomSafeAreaInset = 0.0;
- if (@available(iOS 11.0, *)) {
- bottomSafeAreaInset = self.mapView.safeAreaInsets.bottom;
- }
-
- return @[
- [MGLOrnamentTestData createWithPostion:MGLOrnamentPositionTopLeft
- offset:CGPointMake(margin, margin)
- expectedOrigin:CGPointMake(margin, margin)],
- [MGLOrnamentTestData createWithPostion:MGLOrnamentPositionTopRight
- offset:CGPointMake(margin, margin)
- expectedOrigin:CGPointMake(CGRectGetMaxX(self.mapView.bounds) - margin - CGRectGetWidth(view.frame), 4)],
- [MGLOrnamentTestData createWithPostion:MGLOrnamentPositionBottomLeft
- offset:CGPointMake(margin, margin)
- expectedOrigin:CGPointMake(margin, CGRectGetMaxY(self.mapView.bounds) - margin - bottomSafeAreaInset - CGRectGetHeight(view.frame))],
- [MGLOrnamentTestData createWithPostion:MGLOrnamentPositionBottomRight
- offset:CGPointMake(margin, margin)
- expectedOrigin:CGPointMake(CGRectGetMaxX(self.mapView.bounds) - margin - CGRectGetWidth(view.frame),
- CGRectGetMaxY(self.mapView.bounds) - margin - bottomSafeAreaInset - CGRectGetHeight(view.frame))]
- ];
-}
-
-- (void)testCompassPlacement {
- double accuracy = 0.01;
- CGFloat margin = 4.0;
-
- UIView *compassView = self.mapView.compassView;
- NSArray *testDataList = [self makeTestDataListWithView:compassView margin:margin];
-
- for (MGLOrnamentTestData *testData in testDataList) {
- self.mapView.compassViewPosition = testData.position;
- self.mapView.compassViewOffset = testData.offset;
-
- //invoke layout
- [self.superView setNeedsLayout];
- [self.superView layoutIfNeeded];
-
- XCTAssertEqualWithAccuracy(CGRectGetMinX(compassView.frame), testData.expectedOrigin.x, accuracy);
- XCTAssertEqualWithAccuracy(CGRectGetMinY(compassView.frame), testData.expectedOrigin.y, accuracy);
- }
-}
-
-- (void)testScalebarPlacement {
- CGFloat bottomSafeAreaInset = 0.0;
- double accuracy = 0.01;
- CGFloat margin = 4.0;
-
- if (@available(iOS 11.0, *)) {
- bottomSafeAreaInset = self.mapView.safeAreaInsets.bottom;
- }
-
- UIView *scaleBar = self.mapView.scaleBar;
- NSArray *testDataList = [self makeTestDataListWithView:scaleBar margin:margin];
-
- for (MGLOrnamentTestData *testData in testDataList) {
- self.mapView.scaleBarPosition = testData.position;
- self.mapView.scaleBarOffset = testData.offset;
-
- //invoke layout
- [self.superView setNeedsLayout];
- [self.superView layoutIfNeeded];
-
- XCTAssertEqualWithAccuracy(CGRectGetMinX(scaleBar.frame), testData.expectedOrigin.x, accuracy);
- XCTAssertEqualWithAccuracy(CGRectGetMinY(scaleBar.frame), testData.expectedOrigin.y, accuracy);
- }
-}
-
-- (void)testAttributionButtonPlacement {
- CGFloat bottomSafeAreaInset = 0.0;
- double accuracy = 0.01;
- CGFloat margin = 4.0;
-
- if (@available(iOS 11.0, *)) {
- bottomSafeAreaInset = self.mapView.safeAreaInsets.bottom;
- }
-
- UIView *attributionButton = self.mapView.attributionButton;
- NSArray *testDataList = [self makeTestDataListWithView:attributionButton margin:margin];
-
- for (MGLOrnamentTestData *testData in testDataList) {
- self.mapView.attributionButtonPosition = testData.position;
- self.mapView.attributionButtonOffset = testData.offset;
-
- //invoke layout
- [self.superView setNeedsLayout];
- [self.superView layoutIfNeeded];
-
- XCTAssertEqualWithAccuracy(CGRectGetMinX(attributionButton.frame), testData.expectedOrigin.x, accuracy);
- XCTAssertEqualWithAccuracy(CGRectGetMinY(attributionButton.frame), testData.expectedOrigin.y, accuracy);
- }
-}
-
-- (void)testLogoPlacement {
- CGFloat bottomSafeAreaInset = 0.0;
- double accuracy = 0.01;
- CGFloat margin = 4.0;
-
- if (@available(iOS 11.0, *)) {
- bottomSafeAreaInset = self.mapView.safeAreaInsets.bottom;
- }
-
- UIView *logoView = self.mapView.logoView;
- NSArray *testDataList = [self makeTestDataListWithView:logoView margin:margin];
-
- for (MGLOrnamentTestData *testData in testDataList) {
- self.mapView.logoViewPosition = testData.position;
- self.mapView.logoViewOffset = testData.offset;
-
- //invoke layout
- [self.superView setNeedsLayout];
- [self.superView layoutIfNeeded];
-
- XCTAssertEqualWithAccuracy(CGRectGetMinX(logoView.frame), testData.expectedOrigin.x, accuracy);
- XCTAssertEqualWithAccuracy(CGRectGetMinY(logoView.frame), testData.expectedOrigin.y, accuracy);
- }
-}
-
@end