Browse Source

Reworked how constraints are stored against installed view

Robert Payne 11 years ago
parent
commit
0b687e37bd
1 changed files with 29 additions and 28 deletions
  1. 29 28
      Snap/Constraint.swift

+ 29 - 28
Snap/Constraint.swift

@@ -268,13 +268,13 @@ public class Constraint {
         self.offset = amount
         return self
     }
-  
+    
     // MARK: install / uninstall
-  
+    
     public func install() -> Array<LayoutConstraint> {
         return self.installOnView(updateExisting: false)
     }
-  
+    
     public func uninstall() {
         self.uninstallFromView()
     }
@@ -297,14 +297,14 @@ public class Constraint {
         } else {
             installOnView = self.fromItem.view?.superview
             if installOnView == nil {
-              if self.fromItem.attributes == ConstraintAttributes.Width || self.fromItem.attributes == ConstraintAttributes.Height {
-                installOnView = self.fromItem.view
-              }
-              
-              if installedOnView == nil {
-                NSException(name: "Cannot Install Constraint", reason: "Missing superview", userInfo: nil).raise()
-                return []
-              }
+                if self.fromItem.attributes == ConstraintAttributes.Width || self.fromItem.attributes == ConstraintAttributes.Height {
+                    installOnView = self.fromItem.view
+                }
+                
+                if installedOnView == nil {
+                    NSException(name: "Cannot Install Constraint", reason: "Missing superview", userInfo: nil).raise()
+                    return []
+                }
             }
         }
         
@@ -388,40 +388,40 @@ public class Constraint {
         
         // add constraints
         installOnView!.addConstraints(layoutConstraints)
-
+        
         self.installedOnView = installOnView
+        self.installedLayoutConstraints = NSHashTable.weakObjectsHashTable()
+        for layoutConstraint in layoutConstraints {
+            self.installedLayoutConstraints!.addObject(layoutConstraint)
+        }
+        
         return layoutConstraints
     }
     
     internal func uninstallFromView() {
         if let view = self.installedOnView {
-            #if os(iOS)
-            var installedConstraints = view.constraints()
-            #else
-            var installedConstraints = view.constraints
-            #endif
-            var constraintsToRemove: Array<LayoutConstraint> = []
-            for installedConstraint in installedConstraints {
-                if let layoutConstraint = installedConstraint as? LayoutConstraint {
-                    if layoutConstraint.constraint === self {
-                        constraintsToRemove.append(layoutConstraint)
-                    }
-                }
+            // remove all installed layout constraints
+            var layoutConstraintsToRemove = Array<LayoutConstraint>()
+            if let installedLayoutConstraints = self.installedLayoutConstraints?.allObjects as? Array<LayoutConstraint> {
+                layoutConstraintsToRemove += installedLayoutConstraints
             }
-            if constraintsToRemove.count > 0 {
-                view.removeConstraints(constraintsToRemove)
+            
+            if layoutConstraintsToRemove.count > 0 {
+                view.removeConstraints(layoutConstraintsToRemove)
             }
-          
+            
+            // clean up the snp_installedLayoutConstraints
             var layoutConstraints = view.snp_installedLayoutConstraints
             var layoutConstraintsToKeep = Array<LayoutConstraint>()
             for layoutConstraint in layoutConstraints {
-                if !contains(constraintsToRemove, layoutConstraint) {
+                if !contains(layoutConstraintsToRemove, layoutConstraint) {
                     layoutConstraintsToKeep.append(layoutConstraint)
                 }
             }
             view.snp_installedLayoutConstraints = layoutConstraintsToKeep
         }
         self.installedOnView = nil
+        self.installedLayoutConstraints = nil
     }
     
     // MARK: private
@@ -434,6 +434,7 @@ public class Constraint {
     private var priority: Float = 1000.0
     private var offset: Any?
     
+    private var installedLayoutConstraints: NSHashTable?
     private weak var installedOnView: View?
     
     private func addConstraint(attributes: ConstraintAttributes) -> Constraint {