Procházet zdrojové kódy

Added mas_remakeConstraints

Nikolay Tymchenko před 11 roky
rodič
revize
a868d0a6bb

+ 5 - 0
Masonry/MASConstraintMaker.h

@@ -79,6 +79,11 @@ typedef NS_OPTIONS(NSInteger, MASAttribute) {
  */
 @property (nonatomic, assign) BOOL updateExisting;
 
+/**
+ *  Whether or not to remove existing constraints prior to installing
+ */
+@property (nonatomic, assign) BOOL removeExisting;
+
 /**
  *	initialises the maker with a default view
  *

+ 6 - 0
Masonry/MASConstraintMaker.m

@@ -32,6 +32,12 @@
 }
 
 - (NSArray *)install {
+    if (self.removeExisting) {
+        NSArray *installedConstraints = [MASViewConstraint installedConstraintsForView:self.view];
+        for (MASConstraint *constraint in installedConstraints) {
+            [constraint uninstall];
+        }
+    }
     NSArray *constraints = self.constraints.copy;
     for (MASConstraint *constraint in constraints) {
         constraint.updateExisting = self.updateExisting;

+ 10 - 0
Masonry/MASViewConstraint.h

@@ -9,6 +9,7 @@
 #import "MASViewAttribute.h"
 #import "MASConstraint.h"
 #import "MASLayoutConstraint.h"
+#import "MASUtilities.h"
 
 /**
  *  A single constraint.
@@ -35,4 +36,13 @@
  */
 - (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute;
 
+/**
+ *  Returns all MASViewConstraints installed with this view as a first item.
+ *
+ *  @param  view  A view to retrieve constraints for.
+ *
+ *  @return An array of MASViewConstraints.
+ */
++ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view;
+
 @end

+ 33 - 1
Masonry/MASViewConstraint.m

@@ -10,6 +10,29 @@
 #import "MASCompositeConstraint.h"
 #import "MASLayoutConstraint.h"
 #import "View+MASAdditions.h"
+#import <objc/runtime.h>
+
+@interface MAS_VIEW (MASConstraints)
+
+@property (nonatomic, readonly) NSMutableSet *mas_installedConstraints;
+
+@end
+
+@implementation MAS_VIEW (MASConstraints)
+
+static char kInstalledConstraintsKey;
+
+- (NSMutableSet *)mas_installedConstraints {
+    NSMutableSet *constraints = objc_getAssociatedObject(self, &kInstalledConstraintsKey);
+    if (!constraints) {
+        constraints = [NSMutableSet set];
+        objc_setAssociatedObject(self, &kInstalledConstraintsKey, constraints, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    }
+    return constraints;
+}
+
+@end
+
 
 @interface MASViewConstraint ()
 
@@ -51,7 +74,13 @@
     return constraint;
 }
 
-#pragma mark - private
+#pragma mark - Public
+
++ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view {
+    return [view.mas_installedConstraints allObjects];
+}
+
+#pragma mark - Private
 
 - (void)setLayoutConstant:(CGFloat)layoutConstant {
     _layoutConstant = layoutConstant;
@@ -344,6 +373,8 @@
         [self.installedView addConstraint:layoutConstraint];
         self.layoutConstraint = layoutConstraint;
     }
+    
+    [firstLayoutItem.mas_installedConstraints addObject:self];
 }
 
 - (MASLayoutConstraint *)layoutConstraintSimiliarTo:(MASLayoutConstraint *)layoutConstraint {
@@ -369,6 +400,7 @@
     [self.installedView removeConstraint:self.layoutConstraint];
     self.layoutConstraint = nil;
     self.installedView = nil;
+    [self.firstViewAttribute.view.mas_installedConstraints removeObject:self];
 }
 
 @end

+ 11 - 0
Masonry/NSArray+MASAdditions.h

@@ -33,4 +33,15 @@
  */
 - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;
 
+/**
+ *  Creates a MASConstraintMaker with each view in the callee.
+ *  Any constraints defined are added to each view or the appropriate superview once the block has finished executing on each view.
+ *  All constraints previously installed for the views will be removed.
+ *
+ *  @param block scope within which you can build up the constraints which you wish to apply to each view.
+ *
+ *  @return Array of created/updated MASConstraints
+ */
+- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;
+
 @end

+ 9 - 0
Masonry/NSArray+MASAdditions.m

@@ -29,4 +29,13 @@
     return constraints;
 }
 
+- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
+    NSMutableArray *constraints = [NSMutableArray array];
+    for (MAS_VIEW *view in self) {
+        NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
+        [constraints addObjectsFromArray:[view mas_remakeConstraints:block]];
+    }
+    return constraints;
+}
+
 @end

+ 5 - 0
Masonry/NSArray+MASShorthandAdditions.h

@@ -18,6 +18,7 @@
 
 - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block;
 - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block;
+- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block;
 
 @end
 
@@ -31,6 +32,10 @@
     return [self mas_updateConstraints:block];
 }
 
+- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block {
+    return [self mas_remakeConstraints:block];
+}
+
 @end
 
 #endif

+ 11 - 0
Masonry/View+MASAdditions.h

@@ -67,4 +67,15 @@
  */
 - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;
 
+/**
+ *  Creates a MASConstraintMaker with the callee view.
+ *  Any constraints defined are added to the view or the appropriate superview once the block has finished executing.
+ *  All constraints previously installed for the view will be removed.
+ *
+ *  @param block scope within which you can build up the constraints which you wish to apply to the view.
+ *
+ *  @return Array of created/updated MASConstraints
+ */
+- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;
+
 @end

+ 8 - 0
Masonry/View+MASAdditions.m

@@ -26,6 +26,14 @@
     return [constraintMaker install];
 }
 
+- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
+    self.translatesAutoresizingMaskIntoConstraints = NO;
+    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
+    constraintMaker.removeExisting = YES;
+    block(constraintMaker);
+    return [constraintMaker install];
+}
+
 #pragma mark - NSLayoutAttribute properties
 
 - (MASViewAttribute *)mas_left {

+ 5 - 0
Masonry/View+MASShorthandAdditions.h

@@ -31,6 +31,7 @@
 
 - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block;
 - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block;
+- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block;
 
 @end
 
@@ -62,6 +63,10 @@ MAS_ATTR_FORWARD(attribute);
     return [self mas_updateConstraints:block];
 }
 
+- (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block {
+    return [self mas_remakeConstraints:block];
+}
+
 @end
 
 #endif