     
     // MARK: - sizing
 
-    func setWidthConstraint(size: CGFloat) -> NSLayoutConstraint {
-        return setSizeConstraint(size, dimension: .Width)
-    }
-    
-    func setHeightConstraint(size: CGFloat) -> NSLayoutConstraint {
-        return setSizeConstraint(size, dimension: .Height)
-    }
-
-    func setMinWidthConstraint(size: CGFloat) -> NSLayoutConstraint {
-        return setSizeConstraint(size, dimension: .Width, relatedBy: .GreaterThanOrEqual)
-    }
-
-    func setMinHeightConstraint(size: CGFloat) -> NSLayoutConstraint {
-        return setSizeConstraint(size, dimension: .Height, relatedBy: .GreaterThanOrEqual)
-    }
-    
-    private func setSizeConstraint(size: CGFloat, dimension: NSLayoutAttribute, relatedBy: NSLayoutRelation = .Equal) -> NSLayoutConstraint {
-        setTranslatesAutoresizingMaskIntoConstraints(false)
-        let widthConstraint = NSLayoutConstraint(item: self,
+    func setWidthConstraint(size: CGFloat, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {
+        return setSizeConstraint(size, dimension: .Width, priority: priority)
+    }
+    
+    func setHeightConstraint(size: CGFloat, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {
+        return setSizeConstraint(size, dimension: .Height, priority: priority)
+    }
+
+    func setMinWidthConstraint(size: CGFloat, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {
+        return setSizeConstraint(size, dimension: .Width, relatedBy: .GreaterThanOrEqual, priority: priority)
+    }
+
+    func setMinHeightConstraint(size: CGFloat, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {
+        return setSizeConstraint(size, dimension: .Height, relatedBy: .GreaterThanOrEqual, priority: priority)
+    }
+    
+    private func setSizeConstraint(size: CGFloat, dimension: NSLayoutAttribute, relatedBy: NSLayoutRelation = .Equal, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {
+        setTranslatesAutoresizingMaskIntoConstraints(false)
+        let sizeConstraint = NSLayoutConstraint(item: self,
             attribute: dimension,
             relatedBy: relatedBy,
             toItem: nil,
             attribute: .NotAnAttribute,
             multiplier: 1,
             constant: size)
-        addConstraint(widthConstraint)
-        return widthConstraint
+        if let priority = priority {
+            sizeConstraint.priority = priority
+        }
+        addConstraint(sizeConstraint)
+        return sizeConstraint
     }
 
     func matchHeightOfTallest(views: UIView...) -> [NSLayoutConstraint] {

            attribute: edge,
            multiplier: 1,
            constant: inset)
        superview.addConstraint(pin)
        return pin
    }

        return pinToEdge(.Bottom, inset: -inset, relatedBy: .LessThanOrEqual)
    }
    
    private func pinToEdge(edge: NSLayoutAttribute, inset: CGFloat = 0, relatedBy: NSLayoutRelation = .Equal, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {
        let superview = self.superview!
        setTranslatesAutoresizingMaskIntoConstraints(false)
        let pin = NSLayoutConstraint(item: self,
