Commit a944d77d by Daniel Jonathan Committed by GitHub

Merge pull request #1236 from OrkhanAlikhanov/layout-relation

Added Layout relations
parents 091e1086 7f374791
...@@ -83,6 +83,7 @@ private extension NSLayoutConstraint { ...@@ -83,6 +83,7 @@ private extension NSLayoutConstraint {
&& secondItem === other.secondItem && secondItem === other.secondItem
&& firstAttribute == other.firstAttribute && firstAttribute == other.firstAttribute
&& secondAttribute == other.secondAttribute && secondAttribute == other.secondAttribute
&& relation == other.relation
} }
} }
...@@ -197,61 +198,67 @@ public extension Layout { ...@@ -197,61 +198,67 @@ public extension Layout {
/** /**
Constraints top of the view to its parent's. Constraints top of the view to its parent's.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func top(_ offset: CGFloat = 0) -> Layout { func top(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.top, constant: offset) return constraint(.top, relationer: relationer, constant: offset)
} }
/** /**
Constraints left of the view to its parent's. Constraints left of the view to its parent's.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func left(_ offset: CGFloat = 0) -> Layout { func left(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.left, constant: offset) return constraint(.left, relationer: relationer, constant: offset)
} }
/** /**
Constraints right of the view to its parent. Constraints right of the view to its parent.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func right(_ offset: CGFloat = 0) -> Layout { func right(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.right, constant: -offset) return constraint(.right, relationer: relationer, constant: -offset)
} }
/** /**
Constraints leading of the view to its parent's. Constraints leading of the view to its parent's.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func leading(_ offset: CGFloat = 0) -> Layout { func leading(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.leading, constant: offset) return constraint(.leading, relationer: relationer, constant: offset)
} }
/** /**
Constraints trailing of the view to its parent. Constraints trailing of the view to its parent.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func trailing(_ offset: CGFloat = 0) -> Layout { func trailing(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.trailing, constant: -offset) return constraint(.trailing, relationer: relationer, constant: -offset)
} }
/** /**
Constraints bottom of the view to its parent's. Constraints bottom of the view to its parent's.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func bottom(_ offset: CGFloat = 0) -> Layout { func bottom(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.bottom, constant: -offset) return constraint(.bottom, relationer: relationer, constant: -offset)
} }
/** /**
...@@ -389,41 +396,45 @@ public extension Layout { ...@@ -389,41 +396,45 @@ public extension Layout {
/** /**
Constraints horizontal center of the view to its parent's. Constraints horizontal center of the view to its parent's.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func centerX(_ offset: CGFloat = 0) -> Layout { func centerX(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.centerX, constant: offset) return constraint(.centerX, relationer: relationer, constant: offset)
} }
/** /**
Constraints vertical center of the view to its parent's. Constraints vertical center of the view to its parent's.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func centerY(_ offset: CGFloat = 0) -> Layout { func centerY(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.centerY, constant: offset) return constraint(.centerY, relationer: relationer, constant: offset)
} }
/** /**
Constraints width of the view to its parent's. Constraints width of the view to its parent's.
- Parameter offset: A CGFloat offset. - Parameter offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func width(offset: CGFloat = 0) -> Layout { func width(offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.width, constant: offset) return constraint(.width, relationer: relationer, constant: offset)
} }
/** /**
Constraints height of the view to its parent's. Constraints height of the view to its parent's.
- Parameter offset: A CGFloat offset. - Parameter offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func height(offset: CGFloat = 0) -> Layout { func height(offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.height, constant: offset) return constraint(.height, relationer: relationer, constant: offset)
} }
/** /**
...@@ -444,61 +455,67 @@ public extension Layout { ...@@ -444,61 +455,67 @@ public extension Layout {
/** /**
Constraints top of the view to its parent's safeArea. Constraints top of the view to its parent's safeArea.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func topSafe(_ offset: CGFloat = 0) -> Layout { func topSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.top, constant: offset, useSafeArea: true) return constraint(.top, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
Constraints left of the view to its parent's safeArea. Constraints left of the view to its parent's safeArea.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func leftSafe(_ offset: CGFloat = 0) -> Layout { func leftSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.left, constant: offset, useSafeArea: true) return constraint(.left, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
Constraints right of the view to its parent. Constraints right of the view to its parent.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func rightSafe(_ offset: CGFloat = 0) -> Layout { func rightSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.right, constant: -offset, useSafeArea: true) return constraint(.right, relationer: relationer, constant: -offset, useSafeArea: true)
} }
/** /**
Constraints leading of the view to its parent's safeArea. Constraints leading of the view to its parent's safeArea.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func leadingSafe(_ offset: CGFloat = 0) -> Layout { func leadingSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.leading, constant: offset, useSafeArea: true) return constraint(.leading, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
Constraints trailing of the view to its parent. Constraints trailing of the view to its parent.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func trailingSafe(_ offset: CGFloat = 0) -> Layout { func trailingSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.trailing, constant: -offset, useSafeArea: true) return constraint(.trailing, relationer: relationer, constant: -offset, useSafeArea: true)
} }
/** /**
Constraints bottom of the view to its parent's safeArea. Constraints bottom of the view to its parent's safeArea.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func bottomSafe(_ offset: CGFloat = 0) -> Layout { func bottomSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.bottom, constant: -offset, useSafeArea: true) return constraint(.bottom, relationer: relationer, constant: -offset, useSafeArea: true)
} }
/** /**
...@@ -636,41 +653,45 @@ public extension Layout { ...@@ -636,41 +653,45 @@ public extension Layout {
/** /**
Constraints horizontal center of the view to its parent's safeArea. Constraints horizontal center of the view to its parent's safeArea.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func centerXSafe(_ offset: CGFloat = 0) -> Layout { func centerXSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.centerX, constant: offset, useSafeArea: true) return constraint(.centerX, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
Constraints vertical center of the view to its parent's safeArea. Constraints vertical center of the view to its parent's safeArea.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func centerYSafe(_ offset: CGFloat = 0) -> Layout { func centerYSafe(_ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.centerY, constant: offset, useSafeArea: true) return constraint(.centerY, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
Constraints width of the view to its parent's safeArea. Constraints width of the view to its parent's safeArea.
- Parameter offset: A CGFloat offset. - Parameter offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func widthSafe(offset: CGFloat = 0) -> Layout { func widthSafe(offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.width, constant: offset, useSafeArea: true) return constraint(.width, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
Constraints height of the view to its parent's safeArea. Constraints height of the view to its parent's safeArea.
- Parameter offset: A CGFloat offset. - Parameter offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func heightSafe(offset: CGFloat = 0) -> Layout { func heightSafe(offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.height, constant: offset, useSafeArea: true) return constraint(.height, relationer: relationer, constant: offset, useSafeArea: true)
} }
/** /**
...@@ -691,21 +712,23 @@ public extension Layout { ...@@ -691,21 +712,23 @@ public extension Layout {
/** /**
Constraints width of the view to a constant value. Constraints width of the view to a constant value.
- Parameter _ width: A CGFloat value. - Parameter _ width: A CGFloat value.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func width(_ width: CGFloat) -> Layout { func width(_ width: CGFloat, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.constantWidth, constants: width) return constraint(.constantWidth, relationer: relationer, constants: width)
} }
/** /**
Constraints height of the view to a constant value. Constraints height of the view to a constant value.
- Parameter _ height: A CGFloat value. - Parameter _ height: A CGFloat value.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func height(_ height: CGFloat) -> Layout { func height(_ height: CGFloat, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.constantHeight, constants: height) return constraint(.constantHeight, relationer: relationer, constants: height)
} }
/** /**
...@@ -724,66 +747,72 @@ public extension Layout { ...@@ -724,66 +747,72 @@ public extension Layout {
Constraints top of the view to the given anchor. Constraints top of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func top(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func top(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.top, to: anchor, constant: offset) return constraint(.top, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
Constraints left of the view to the given anchor. Constraints left of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func left(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func left(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.left, to: anchor, constant: offset) return constraint(.left, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
Constraints right of the view to the given anchor. Constraints right of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func right(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func right(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.right, to: anchor, constant: -offset) return constraint(.right, to: anchor, relationer: relationer, constant: -offset)
} }
/** /**
Constraints leading of the view to the given anchor. Constraints leading of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func leading(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func leading(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.leading, to: anchor, constant: offset) return constraint(.leading, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
Constraints trailing of the view to the given anchor. Constraints trailing of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func trailing(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func trailing(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.trailing, to: anchor, constant: -offset) return constraint(.trailing, to: anchor, relationer: relationer, constant: -offset)
} }
/** /**
Constraints bottom of the view to the given anchor. Constraints bottom of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func bottom(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func bottom(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.bottom, to: anchor, constant: -offset) return constraint(.bottom, to: anchor, relationer: relationer, constant: -offset)
} }
/** /**
...@@ -934,44 +963,48 @@ public extension Layout { ...@@ -934,44 +963,48 @@ public extension Layout {
Constraints horizontal center of the view to the given anchor. Constraints horizontal center of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func centerX(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func centerX(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.centerX, to: anchor, constant: offset) return constraint(.centerX, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
Constraints vertical center of the view to the given anchor. Constraints vertical center of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter _ offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func centerY(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func centerY(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.centerY, to: anchor, constant: offset) return constraint(.centerY, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
Constraints width of the view to the given anchor. Constraints width of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func width(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func width(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.width, to: anchor, constant: offset) return constraint(.width, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
Constraints height of the view to the given anchor. Constraints height of the view to the given anchor.
- Parameter _ anchor: A LayoutAnchorable. - Parameter _ anchor: A LayoutAnchorable.
- Parameter offset: A CGFloat offset. - Parameter _ offset: A CGFloat offset.
- Parameter _ relationer: A LayoutRelationer.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
@discardableResult @discardableResult
func height(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0) -> Layout { func height(_ anchor: LayoutAnchorable, _ offset: CGFloat = 0, _ relationer: LayoutRelationer = LayoutRelationerStruct.equal) -> Layout {
return constraint(.height, to: anchor, constant: offset) return constraint(.height, to: anchor, relationer: relationer, constant: offset)
} }
/** /**
...@@ -1050,21 +1083,23 @@ private extension Layout { ...@@ -1050,21 +1083,23 @@ private extension Layout {
Constraints the view to its parent according to the provided attribute. Constraints the view to its parent according to the provided attribute.
If the constraint already exists, will update its constant. If the constraint already exists, will update its constant.
- Parameter _ attribute: A LayoutAttribute. - Parameter _ attribute: A LayoutAttribute.
- Parameter _ relationer: A LayoutRelationer.
- Parameter constant: A CGFloat. - Parameter constant: A CGFloat.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
func constraint(_ attribute: LayoutAttribute, constant: CGFloat, useSafeArea: Bool = false) -> Layout { func constraint(_ attribute: LayoutAttribute, relationer: LayoutRelationer = LayoutRelationerStruct.equal, constant: CGFloat, useSafeArea: Bool = false) -> Layout {
return constraint([attribute], constants: constant, useSafeArea: useSafeArea) return constraint([attribute], relationer: relationer, constants: constant, useSafeArea: useSafeArea)
} }
/** /**
Constraints the view to its parent according to the provided attributes. Constraints the view to its parent according to the provided attributes.
If any of the constraints already exists, will update its constant. If any of the constraints already exists, will update its constant.
- Parameter _ attributes: An array of LayoutAttribute. - Parameter _ attributes: An array of LayoutAttribute.
- Parameter _ relationer: A LayoutRelationer.
- Parameter constants: A list of CGFloat. - Parameter constants: A list of CGFloat.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
func constraint(_ attributes: [LayoutAttribute], constants: CGFloat..., useSafeArea: Bool = false) -> Layout { func constraint(_ attributes: [LayoutAttribute], relationer: LayoutRelationer = LayoutRelationerStruct.equal, constants: CGFloat..., useSafeArea: Bool = false) -> Layout {
var attributes = attributes var attributes = attributes
var anchor: LayoutAnchor! var anchor: LayoutAnchor!
...@@ -1079,7 +1114,7 @@ private extension Layout { ...@@ -1079,7 +1114,7 @@ private extension Layout {
anchor = LayoutAnchor(constraintable: useSafeArea ? parent?.safeAnchor.constraintable : parent, attributes: attributes) anchor = LayoutAnchor(constraintable: useSafeArea ? parent?.safeAnchor.constraintable : parent, attributes: attributes)
} }
return constraint(attributes, to: anchor, constants: constants) return constraint(attributes, to: anchor, relationer: relationer, constants: constants)
} }
/** /**
...@@ -1087,11 +1122,12 @@ private extension Layout { ...@@ -1087,11 +1122,12 @@ private extension Layout {
If the constraint already exists, will update its constant. If the constraint already exists, will update its constant.
- Parameter _ attribute: A LayoutAttribute. - Parameter _ attribute: A LayoutAttribute.
- Parameter to anchor: A LayoutAnchorable. - Parameter to anchor: A LayoutAnchorable.
- Parameter relation: A LayoutRelation between anchors.
- Parameter constant: A CGFloat. - Parameter constant: A CGFloat.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
func constraint(_ attribute: LayoutAttribute, to anchor: LayoutAnchorable, constant: CGFloat) -> Layout { func constraint(_ attribute: LayoutAttribute, to anchor: LayoutAnchorable, relationer: LayoutRelationer = LayoutRelationerStruct.equal, constant: CGFloat) -> Layout {
return constraint([attribute], to: anchor, constants: constant) return constraint([attribute], to: anchor, relationer: relationer, constants: constant)
} }
/** /**
...@@ -1099,11 +1135,12 @@ private extension Layout { ...@@ -1099,11 +1135,12 @@ private extension Layout {
If any of the constraints already exists, will update its constant. If any of the constraints already exists, will update its constant.
- Parameter _ attributes: An array of LayoutAttribute. - Parameter _ attributes: An array of LayoutAttribute.
- Parameter to anchor: A LayoutAnchorable. - Parameter to anchor: A LayoutAnchorable.
- Parameter relation: A LayoutRelation between anchors.
- Parameter constants: A list of CGFloat. - Parameter constants: A list of CGFloat.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
func constraint(_ attributes: [LayoutAttribute], to anchor: LayoutAnchorable, constants: CGFloat...) -> Layout { func constraint(_ attributes: [LayoutAttribute], to anchor: LayoutAnchorable, relationer: LayoutRelationer = LayoutRelationerStruct.equal, constants: CGFloat...) -> Layout {
return constraint(attributes, to: anchor, constants: constants) return constraint(attributes, to: anchor, relationer: relationer, constants: constants)
} }
/** /**
...@@ -1111,17 +1148,18 @@ private extension Layout { ...@@ -1111,17 +1148,18 @@ private extension Layout {
If any of the constraints already exists, will update its constant. If any of the constraints already exists, will update its constant.
- Parameter _ attributes: An array of LayoutAttribute. - Parameter _ attributes: An array of LayoutAttribute.
- Parameter to anchor: A LayoutAnchorable. - Parameter to anchor: A LayoutAnchorable.
- Parameter relation: A LayoutRelation between anchors.
- Parameter constants: An array of CGFloat. - Parameter constants: An array of CGFloat.
- Returns: A Layout instance to allow chaining. - Returns: A Layout instance to allow chaining.
*/ */
func constraint(_ attributes: [LayoutAttribute], to anchor: LayoutAnchorable, constants: [CGFloat]) -> Layout { func constraint(_ attributes: [LayoutAttribute], to anchor: LayoutAnchorable, relationer: LayoutRelationer, constants: [CGFloat]) -> Layout {
let from = LayoutAnchor(constraintable: constraintable, attributes: attributes) let from = LayoutAnchor(constraintable: constraintable, attributes: attributes)
var to = anchor as? LayoutAnchor var to = anchor as? LayoutAnchor
if to?.attributes.isEmpty ?? true { if to?.attributes.isEmpty ?? true {
let v = (anchor as? UIView) ?? (anchor as? LayoutAnchor)?.constraintable let v = (anchor as? UIView) ?? (anchor as? LayoutAnchor)?.constraintable
to = LayoutAnchor(constraintable: v, attributes: attributes) to = LayoutAnchor(constraintable: v, attributes: attributes)
} }
let constraint = LayoutConstraint(fromAnchor: from, toAnchor: to!, constants: constants) let constraint = LayoutConstraint(fromAnchor: from, toAnchor: to!, relation: relationer(.nil, .nil), constants: constants)
let constraints = (view?.constraints ?? []) + (view?.superview?.constraints ?? []) let constraints = (view?.constraints ?? []) + (view?.superview?.constraints ?? [])
...@@ -1139,3 +1177,36 @@ private extension Layout { ...@@ -1139,3 +1177,36 @@ private extension Layout {
return self return self
} }
} }
/// A closure typealias for relation operators.
public typealias LayoutRelationer = (LayoutRelationerStruct, LayoutRelationerStruct) -> LayoutRelation
/// A dummy struct used in creating relation operators (==, >=, <=).
public struct LayoutRelationerStruct {
/// Passed as an unused argument to the LayoutRelationer closures.
static let `nil` = LayoutRelationerStruct()
/**
A method used as a default parameter for LayoutRelationer closures.
Swift does not allow using == operator directly, so we had to create this.
*/
public static func equal(left: LayoutRelationerStruct, right: LayoutRelationerStruct) -> LayoutRelation {
return .equal
}
}
/// A method returning `LayoutRelation.equal`
public func ==(left: LayoutRelationerStruct, right: LayoutRelationerStruct) -> LayoutRelation {
return .equal
}
/// A method returning `LayoutRelation.greaterThanOrEqual`
public func >=(left: LayoutRelationerStruct, right: LayoutRelationerStruct) -> LayoutRelation {
return .greaterThanOrEqual
}
/// A method returning `LayoutRelation.lessThanOrEqual`
public func <=(left: LayoutRelationerStruct, right: LayoutRelationerStruct) -> LayoutRelation {
return .lessThanOrEqual
}
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
import UIKit import UIKit
/// A typealias for NSLayoutConstraint.Relation
public typealias LayoutRelation = NSLayoutConstraint.Relation
internal struct LayoutConstraint { internal struct LayoutConstraint {
/// `From` anchor for the constraint. /// `From` anchor for the constraint.
private let fromAnchor: LayoutAnchor private let fromAnchor: LayoutAnchor
...@@ -33,17 +36,23 @@ internal struct LayoutConstraint { ...@@ -33,17 +36,23 @@ internal struct LayoutConstraint {
private let toAnchor: LayoutAnchor private let toAnchor: LayoutAnchor
/// An array of constants for the constraint. /// An array of constants for the constraint.
private var constants: [CGFloat] private let constants: [CGFloat]
/// A LayoutRelation between anchors.
private let relation: LayoutRelation
/** /**
An initializer taking `from` and `to` anchors and constants for the constraint. An initializer taking `from` and `to` anchors, their `relation` and constants for the constraint.
- Parameter fromAnchor: A LayoutAnchor. - Parameter fromAnchor: A LayoutAnchor.
- Parameter toAnchor: A LayoutAnchor. - Parameter toAnchor: A LayoutAnchor.
- Parameter relation: A LayoutRelation between anchors.
- Parameter constants: An array of CGFloat. - Parameter constants: An array of CGFloat.
*/ */
init(fromAnchor: LayoutAnchor, toAnchor: LayoutAnchor, constants: [CGFloat]) { init(fromAnchor: LayoutAnchor, toAnchor: LayoutAnchor, relation: LayoutRelation, constants: [CGFloat]) {
self.fromAnchor = fromAnchor self.fromAnchor = fromAnchor
self.toAnchor = toAnchor self.toAnchor = toAnchor
self.relation = relation
self.constants = constants self.constants = constants
} }
} }
...@@ -64,7 +73,7 @@ internal extension LayoutConstraint { ...@@ -64,7 +73,7 @@ internal extension LayoutConstraint {
zip(zip(fromAnchor.attributes, toAnchor.attributes), constants).forEach { zip(zip(fromAnchor.attributes, toAnchor.attributes), constants).forEach {
v.append(NSLayoutConstraint(item: fromAnchor.constraintable as Any, v.append(NSLayoutConstraint(item: fromAnchor.constraintable as Any,
attribute: $0.0, attribute: $0.0,
relatedBy: .equal, relatedBy: relation,
toItem: toAnchor.constraintable, toItem: toAnchor.constraintable,
attribute: $0.1, attribute: $0.1,
multiplier: 1, multiplier: 1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment