From 5ea41a5583e714357e8c8d358d977823a2f24b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguy=E1=BB=85n?= Date: Fri, 26 Jun 2015 00:56:26 -0700 Subject: Avoid removing content size constraints Also, on iOS 8.0+, use `+[NSLayoutConstraint activateConstraints:]` and `+deactivateConstraints:` to efficiently prevent redundant constraints from lingering. Fixes #1779. --- platform/ios/MGLMapView.mm | 91 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 59666c926b..50debf336b 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -69,7 +69,9 @@ CLLocationDegrees MGLDegreesFromRadians(CGFloat radians) @property (nonatomic) NSOperationQueue *regionChangeDelegateQueue; @property (nonatomic) UIImageView *compass; @property (nonatomic) UIImageView *logoBug; +@property (nonatomic) NS_MUTABLE_ARRAY_OF(NSLayoutConstraint *) *logoBugConstraints; @property (nonatomic) UIButton *attributionButton; +@property (nonatomic) NS_MUTABLE_ARRAY_OF(NSLayoutConstraint *) *attributionButtonConstraints; @property (nonatomic) UIActionSheet *attributionSheet; @property (nonatomic) UIPanGestureRecognizer *pan; @property (nonatomic) UIPinchGestureRecognizer *pinch; @@ -281,6 +283,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) _logoBug.accessibilityLabel = @"Mapbox logo"; _logoBug.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:_logoBug]; + _logoBugConstraints = [NSMutableArray array]; // setup attribution // @@ -289,6 +292,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) [_attributionButton addTarget:self action:@selector(showAttribution) forControlEvents:UIControlEventTouchUpInside]; _attributionButton.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:_attributionButton]; + _attributionButtonConstraints = [NSMutableArray array]; _attributionSheet = [[UIActionSheet alloc] initWithTitle:@"Mapbox GL for iOS" delegate:self @@ -429,6 +433,11 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) { [EAGLContext setCurrentContext:nil]; } + + [self.logoBugConstraints removeAllObjects]; + self.logoBugConstraints = nil; + [self.attributionButtonConstraints removeAllObjects]; + self.attributionButtonConstraints = nil; } - (void)setDelegate:(nullable id)delegate @@ -459,15 +468,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) return YES; } -- (void)didMoveToSuperview -{ - [self.compass.superview removeConstraints:self.compass.superview.constraints]; - [self.logoBug removeConstraints:self.logoBug.constraints]; - [self.attributionButton removeConstraints:self.attributionButton.constraints]; - - [self setNeedsUpdateConstraints]; -} - - (UIViewController *)viewControllerForLayoutGuides { // Per -[UIResponder nextResponder] documentation, a UIView’s next responder @@ -498,10 +498,19 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) // compass // UIView *compassContainer = self.compass.superview; + if ([NSLayoutConstraint respondsToSelector:@selector(deactivateConstraints:)]) + { + [NSLayoutConstraint deactivateConstraints:compassContainer.constraints]; + } + else + { + [compassContainer removeConstraints:compassContainer.constraints]; + } + NSMutableArray *compassContainerConstraints = [NSMutableArray array]; if (viewController) { - [constraintParentView addConstraint: + [compassContainerConstraints addObject: [NSLayoutConstraint constraintWithItem:compassContainer attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationGreaterThanOrEqual @@ -510,7 +519,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:5]]; } - [constraintParentView addConstraint: + [compassContainerConstraints addObject: [NSLayoutConstraint constraintWithItem:compassContainer attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationGreaterThanOrEqual @@ -519,7 +528,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:5]]; - [constraintParentView addConstraint: + [compassContainerConstraints addObject: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual @@ -528,7 +537,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:5]]; - [compassContainer addConstraint: + [compassContainerConstraints addObject: [NSLayoutConstraint constraintWithItem:compassContainer attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual @@ -537,7 +546,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:self.compass.image.size.width]]; - [compassContainer addConstraint: + [compassContainerConstraints addObject: [NSLayoutConstraint constraintWithItem:compassContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual @@ -545,12 +554,29 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:self.compass.image.size.height]]; + if ([NSLayoutConstraint respondsToSelector:@selector(activateConstraints:)]) + { + [NSLayoutConstraint activateConstraints:compassContainerConstraints]; + } + else + { + [compassContainer addConstraints:compassContainerConstraints]; + } // logo bug // + if ([NSLayoutConstraint respondsToSelector:@selector(deactivateConstraints:)]) + { + [NSLayoutConstraint deactivateConstraints:self.logoBugConstraints]; + } + else + { + [self.logoBug removeConstraints:self.logoBugConstraints]; + } + [self.logoBugConstraints removeAllObjects]; if (viewController) { - [constraintParentView addConstraint: + [self.logoBugConstraints addObject: [NSLayoutConstraint constraintWithItem:viewController.bottomLayoutGuide attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationGreaterThanOrEqual @@ -559,7 +585,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:8]]; } - [constraintParentView addConstraint: + [self.logoBugConstraints addObject: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationGreaterThanOrEqual @@ -568,7 +594,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:8]]; - [constraintParentView addConstraint: + [self.logoBugConstraints addObject: [NSLayoutConstraint constraintWithItem:self.logoBug attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual @@ -576,12 +602,29 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) attribute:NSLayoutAttributeLeading multiplier:1 constant:8]]; + if ([NSLayoutConstraint respondsToSelector:@selector(activateConstraints:)]) + { + [NSLayoutConstraint activateConstraints:self.logoBugConstraints]; + } + else + { + [constraintParentView addConstraints:self.logoBugConstraints]; + } // attribution button // + if ([NSLayoutConstraint respondsToSelector:@selector(deactivateConstraints:)]) + { + [NSLayoutConstraint deactivateConstraints:self.attributionButtonConstraints]; + } + else + { + [self.attributionButton removeConstraints:self.attributionButtonConstraints]; + } + [self.attributionButtonConstraints removeAllObjects]; if (viewController) { - [constraintParentView addConstraint: + [self.attributionButtonConstraints addObject: [NSLayoutConstraint constraintWithItem:viewController.bottomLayoutGuide attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationGreaterThanOrEqual @@ -590,7 +633,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:8]]; } - [constraintParentView addConstraint: + [self.attributionButtonConstraints addObject: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationGreaterThanOrEqual @@ -599,7 +642,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) multiplier:1 constant:8]]; - [constraintParentView addConstraint: + [self.attributionButtonConstraints addObject: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual @@ -607,6 +650,14 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) attribute:NSLayoutAttributeTrailing multiplier:1 constant:8]]; + if ([NSLayoutConstraint respondsToSelector:@selector(activateConstraints:)]) + { + [NSLayoutConstraint activateConstraints:self.attributionButtonConstraints]; + } + else + { + [constraintParentView addConstraints:self.attributionButtonConstraints]; + } [super updateConstraints]; } -- cgit v1.2.1