Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

[ios] Don't use negative content insets #4504

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions platform/ios/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Mapbox welcomes participation and contributions from everyone. If you’d like
- If you’ve previously installed the SDK as a static framework, the installation workflow has changed to address issues when submitting your application to the App Store or installing it on a device. Upon upgrading to this version of the SDK, you’ll need to add Mapbox.bundle to the Copy Bundle Resources build phase and remove Mapbox.framework from the Embed Frameworks build phase. ([#4455](https://github.com/mapbox/mapbox-gl-native/pull/4455))
- Offline packs can now be downloaded to allow users to view specific regions of the map offline. A new MGLOfflineStorage class provides APIs for managing MGLOfflinePacks. ([#4221](https://github.com/mapbox/mapbox-gl-native/pull/4221))
- Tiles and other resources are cached in the same file that holds offline resources. The combined cache file is located in a subdirectory of the user’s Application Support directory, which means iOS will not delete the file when disk space runs low. ([#4377](https://github.com/mapbox/mapbox-gl-native/pull/4377))
- Fixed an issue where the map view’s center would always be calculated as if the view occupied the entire screen. ([#4504](https://github.com/mapbox/mapbox-gl-native/issues/4504))
- The user dot no longer disappears after panning the map across the antimeridian at low zoom levels. ([#4275](https://github.com/mapbox/mapbox-gl-native/pull/4275))
- The map no longer recoils when panning quickly at low zoom levels. ([#4214](https://github.com/mapbox/mapbox-gl-native/pull/4214))
- Fixed an issue causing the map to pan the wrong way when the user pinches unevenly. ([#4427](https://github.com/mapbox/mapbox-gl-native/pull/4427))
Expand Down
11 changes: 8 additions & 3 deletions platform/ios/src/MGLMapView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,11 @@ - (void)adjustContentInset
- viewController.bottomLayoutGuide.length);
contentInset.bottom = (CGRectGetMaxY(self.bounds)
- [self convertPoint:bottomPoint fromView:viewController.view].y);

// Negative insets are invalid, replace with 0.
contentInset.top = fmaxf(contentInset.top, 0);
contentInset.bottom = fmaxf(contentInset.bottom, 0);

self.contentInset = contentInset;
}

Expand Down Expand Up @@ -2964,9 +2969,9 @@ - (void)deselectAnnotation:(id <MGLAnnotation>)annotation animated:(BOOL)animate

- (void)showAnnotations:(NS_ARRAY_OF(id <MGLAnnotation>) *)annotations animated:(BOOL)animated
{
CGFloat defaultPadding = 100;
CGFloat yPadding = (self.frame.size.height / 2 <= defaultPadding) ? (self.frame.size.height / 5) : defaultPadding;
CGFloat xPadding = (self.frame.size.width / 2 <= defaultPadding) ? (self.frame.size.width / 5) : defaultPadding;
CGFloat maximumPadding = 100;
CGFloat yPadding = (self.frame.size.height / 5 <= maximumPadding) ? (self.frame.size.height / 5) : maximumPadding;
CGFloat xPadding = (self.frame.size.width / 5 <= maximumPadding) ? (self.frame.size.width / 5) : maximumPadding;

UIEdgeInsets edgeInsets = UIEdgeInsetsMake(yPadding, xPadding, yPadding, xPadding);

Expand Down
1 change: 1 addition & 0 deletions platform/ios/test/MGLTViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
@interface MGLTViewController : UIViewController

- (void)insetMapView;
- (void)tinyMapView;
- (void)resetMapView;

@end
5 changes: 5 additions & 0 deletions platform/ios/test/MGLTViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ - (void)insetMapView
_mapView.frame = CGRectInset(_mapView.frame, 50, 50);
}

- (void)tinyMapView
{
_mapView.frame = CGRectMake(20, self.topLayoutGuide.length, self.view.frame.size.width / 2, self.view.frame.size.height / 2);
}

- (void)resetMapView
{
_mapView.frame = self.view.bounds;
Expand Down
23 changes: 23 additions & 0 deletions platform/ios/test/MapViewTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,29 @@ - (void)testInsetMapView {
@"compass should lie inside shrunken map view");
}

- (void)testContentInsetsWithTinyMapView {
[tester.viewController tinyMapView];
[self keyValueObservingExpectationForObject:tester.mapView keyPath:@"contentInset" handler:^BOOL(id observedObject, NSDictionary *change) {
XCTAssertEqual(tester.mapView.contentInset.top,
0,
@"map should not have top content inset");
XCTAssertEqual(tester.mapView.contentInset.bottom,
0,
@"map should not have bottom content inset");
return YES;
}];
[self waitForExpectationsWithTimeout:2.0 handler:nil];

tester.mapView.frame = CGRectMake(0, 0, tester.mapView.frame.size.width, tester.mapView.frame.size.height);
[self keyValueObservingExpectationForObject:tester.mapView keyPath:@"contentInset" handler:^BOOL(id observedObject, NSDictionary *change) {
XCTAssertEqual(tester.mapView.contentInset.top,
tester.viewController.topLayoutGuide.length,
@"map should have top content inset equal to the top layout guide");
return YES;
}];
[self waitForExpectationsWithTimeout:2.0 handler:nil];
}

- (void)testDelegateRegionWillChange {
__block NSUInteger unanimatedCount;
__block NSUInteger animatedCount;
Expand Down