From 153b57fba53ce165b118ccba89f3704a592ce0cf Mon Sep 17 00:00:00 2001 From: Evan Liu Date: Tue, 29 Nov 2016 07:48:00 +1300 Subject: [PATCH] Add aspectRatio helper --- .../Contents.swift | 2 +- .../Helpers.xcplaygroundpage/Contents.swift | 8 +- .../Doc.xcworkspace/contents.xcworkspacedata | 3 + Documentation/Images/Helpers.png | Bin 15726 -> 20701 bytes README.md | 10 +- Scripts/anchors.swift | 4 +- Scripts/helpers.swift | 4 +- Sources/ConstraintMaker+Anchors.swift | 112 +++++++++--------- Sources/ConstraintMaker+Helpers.swift | 77 +++++++++++- Sources/ConstraintMaker.swift | 3 + Sources/GroupConstraintMaker.swift | 9 ++ Sources/ItemConstraintMaker.swift | 5 + 12 files changed, 165 insertions(+), 72 deletions(-) diff --git a/Documentation/Doc.playground/Pages/FormationLayout.xcplaygroundpage/Contents.swift b/Documentation/Doc.playground/Pages/FormationLayout.xcplaygroundpage/Contents.swift index d537320..4bd1c26 100644 --- a/Documentation/Doc.playground/Pages/FormationLayout.xcplaygroundpage/Contents.swift +++ b/Documentation/Doc.playground/Pages/FormationLayout.xcplaygroundpage/Contents.swift @@ -10,7 +10,7 @@ import FormationLayout `FormationLayout` is the top level layout class for one root view. - `FormationLayout` takes a `UIView` as its `rootView`. - - `translatesAutoresizingMaskIntoConstraints` of `rootView` is set to false by default but can also be true if set in constructor. + - `translatesAutoresizingMaskIntoConstraints` of `rootView` is not set to false by default but can be set in constructor. - `translatesAutoresizingMaskIntoConstraints` of subviews will be set to false automaticly. - Subviews with no `superView` will be added to `rootView` automaticly. */ diff --git a/Documentation/Doc.playground/Pages/Helpers.xcplaygroundpage/Contents.swift b/Documentation/Doc.playground/Pages/Helpers.xcplaygroundpage/Contents.swift index e96d51b..a5b69eb 100644 --- a/Documentation/Doc.playground/Pages/Helpers.xcplaygroundpage/Contents.swift +++ b/Documentation/Doc.playground/Pages/Helpers.xcplaygroundpage/Contents.swift @@ -7,15 +7,17 @@ import FormationLayout ## Helpers ---- + - aspectRatio: `width:height` - size: width & height - center: centerX & centerY */ -demo { canvas, icon1, icon2 in +demo { canvas, icon1, icon2, icon3 in let layout = FormationLayout(rootView: canvas) - layout[icon1].size(equalTo: 30).center(equalTo: canvas, multiplyBy: 0.8) - layout[icon2].size(equalTo: icon1, minus: 10).center(equalTo: icon1, plus: 30) + layout[icon1].aspectRatio(equalTo: 1.5).width(equalTo: 30) + layout[icon2].size(equalTo: 30).center(equalTo: canvas, multiplyBy: 0.8) + layout[icon3].size(equalTo: icon2, minus: 10).center(equalTo: icon2, plus: 30) } //: [Home](Home) | [Previous](@previous) | [Next](@next) diff --git a/Documentation/Doc.xcworkspace/contents.xcworkspacedata b/Documentation/Doc.xcworkspace/contents.xcworkspacedata index 77328c6..98859ab 100644 --- a/Documentation/Doc.xcworkspace/contents.xcworkspacedata +++ b/Documentation/Doc.xcworkspace/contents.xcworkspacedata @@ -4,6 +4,9 @@ + + diff --git a/Documentation/Images/Helpers.png b/Documentation/Images/Helpers.png index b94d9cd7835e846b8f5436271206c6fac1a23ac5..ffcc2f59033c3ae7d8a2a340bb48699e81abbf3e 100644 GIT binary patch delta 17541 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 Self { - return makeConstraint(attribute: .left, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .left, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.left greaterThanOrEqualTo item2.left * multiplier + constant @@ -435,7 +435,7 @@ extension ConstraintMaker { /// Make item.left greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func left(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .left, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .left, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.left greaterThanOrEqualTo item2.left * multiplier - constant @@ -451,7 +451,7 @@ extension ConstraintMaker { /// Make item.right greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func right(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .right, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .right, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.right greaterThanOrEqualTo item2.right * multiplier + constant @@ -463,7 +463,7 @@ extension ConstraintMaker { /// Make item.right greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func right(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .right, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .right, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.right greaterThanOrEqualTo item2.right * multiplier - constant @@ -479,7 +479,7 @@ extension ConstraintMaker { /// Make item.top greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func top(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .top, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .top, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.top greaterThanOrEqualTo item2.top * multiplier + constant @@ -491,7 +491,7 @@ extension ConstraintMaker { /// Make item.top greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func top(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .top, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .top, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.top greaterThanOrEqualTo item2.top * multiplier - constant @@ -507,7 +507,7 @@ extension ConstraintMaker { /// Make item.bottom greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func bottom(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .bottom, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .bottom, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.bottom greaterThanOrEqualTo item2.bottom * multiplier + constant @@ -519,7 +519,7 @@ extension ConstraintMaker { /// Make item.bottom greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func bottom(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .bottom, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .bottom, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.bottom greaterThanOrEqualTo item2.bottom * multiplier - constant @@ -535,7 +535,7 @@ extension ConstraintMaker { /// Make item.leading greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func leading(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .leading, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.leading greaterThanOrEqualTo item2.leading * multiplier + constant @@ -547,7 +547,7 @@ extension ConstraintMaker { /// Make item.leading greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func leading(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .leading, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.leading greaterThanOrEqualTo item2.leading * multiplier - constant @@ -563,7 +563,7 @@ extension ConstraintMaker { /// Make item.trailing greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func trailing(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .trailing, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .trailing, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.trailing greaterThanOrEqualTo item2.trailing * multiplier + constant @@ -575,7 +575,7 @@ extension ConstraintMaker { /// Make item.trailing greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func trailing(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .trailing, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .trailing, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.trailing greaterThanOrEqualTo item2.trailing * multiplier - constant @@ -591,7 +591,7 @@ extension ConstraintMaker { /// Make item.width greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func width(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .width, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .width, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.width greaterThanOrEqualTo item2.width * multiplier + constant @@ -603,7 +603,7 @@ extension ConstraintMaker { /// Make item.width greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func width(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .width, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .width, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.width greaterThanOrEqualTo item2.width * multiplier - constant @@ -619,7 +619,7 @@ extension ConstraintMaker { /// Make item.height greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func height(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .height, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .height, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.height greaterThanOrEqualTo item2.height * multiplier + constant @@ -631,7 +631,7 @@ extension ConstraintMaker { /// Make item.height greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func height(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .height, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .height, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.height greaterThanOrEqualTo item2.height * multiplier - constant @@ -647,7 +647,7 @@ extension ConstraintMaker { /// Make item.centerX greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerX(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerX, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerX, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerX greaterThanOrEqualTo item2.centerX * multiplier + constant @@ -659,7 +659,7 @@ extension ConstraintMaker { /// Make item.centerX greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerX(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerX, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerX, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerX greaterThanOrEqualTo item2.centerX * multiplier - constant @@ -675,7 +675,7 @@ extension ConstraintMaker { /// Make item.centerY greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerY(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerY, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerY, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerY greaterThanOrEqualTo item2.centerY * multiplier + constant @@ -687,7 +687,7 @@ extension ConstraintMaker { /// Make item.centerY greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerY(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerY, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerY, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerY greaterThanOrEqualTo item2.centerY * multiplier - constant @@ -703,7 +703,7 @@ extension ConstraintMaker { /// Make item.lastBaseline greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func lastBaseline(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .lastBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .lastBaseline, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.lastBaseline greaterThanOrEqualTo item2.lastBaseline * multiplier + constant @@ -715,7 +715,7 @@ extension ConstraintMaker { /// Make item.lastBaseline greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func lastBaseline(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .lastBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .lastBaseline, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.lastBaseline greaterThanOrEqualTo item2.lastBaseline * multiplier - constant @@ -731,7 +731,7 @@ extension ConstraintMaker { /// Make item.firstBaseline greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func firstBaseline(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .firstBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .firstBaseline, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.firstBaseline greaterThanOrEqualTo item2.firstBaseline * multiplier + constant @@ -743,7 +743,7 @@ extension ConstraintMaker { /// Make item.firstBaseline greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func firstBaseline(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .firstBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .firstBaseline, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.firstBaseline greaterThanOrEqualTo item2.firstBaseline * multiplier - constant @@ -759,7 +759,7 @@ extension ConstraintMaker { /// Make item.centerXWithinMargins greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerXWithinMargins(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerXWithinMargins greaterThanOrEqualTo item2.centerXWithinMargins * multiplier + constant @@ -771,7 +771,7 @@ extension ConstraintMaker { /// Make item.centerXWithinMargins greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerXWithinMargins(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerXWithinMargins greaterThanOrEqualTo item2.centerXWithinMargins * multiplier - constant @@ -787,7 +787,7 @@ extension ConstraintMaker { /// Make item.centerYWithinMargins greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerYWithinMargins(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerYWithinMargins greaterThanOrEqualTo item2.centerYWithinMargins * multiplier + constant @@ -799,7 +799,7 @@ extension ConstraintMaker { /// Make item.centerYWithinMargins greaterThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerYWithinMargins(greaterThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .greaterThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerYWithinMargins greaterThanOrEqualTo item2.centerYWithinMargins * multiplier - constant @@ -815,7 +815,7 @@ extension ConstraintMaker { /// Make item.left lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func left(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .left, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .left, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.left lessThanOrEqualTo item2.left * multiplier + constant @@ -827,7 +827,7 @@ extension ConstraintMaker { /// Make item.left lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func left(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .left, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .left, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.left lessThanOrEqualTo item2.left * multiplier - constant @@ -843,7 +843,7 @@ extension ConstraintMaker { /// Make item.right lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func right(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .right, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .right, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.right lessThanOrEqualTo item2.right * multiplier + constant @@ -855,7 +855,7 @@ extension ConstraintMaker { /// Make item.right lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func right(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .right, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .right, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.right lessThanOrEqualTo item2.right * multiplier - constant @@ -871,7 +871,7 @@ extension ConstraintMaker { /// Make item.top lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func top(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .top, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .top, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.top lessThanOrEqualTo item2.top * multiplier + constant @@ -883,7 +883,7 @@ extension ConstraintMaker { /// Make item.top lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func top(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .top, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .top, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.top lessThanOrEqualTo item2.top * multiplier - constant @@ -899,7 +899,7 @@ extension ConstraintMaker { /// Make item.bottom lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func bottom(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .bottom, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .bottom, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.bottom lessThanOrEqualTo item2.bottom * multiplier + constant @@ -911,7 +911,7 @@ extension ConstraintMaker { /// Make item.bottom lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func bottom(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .bottom, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .bottom, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.bottom lessThanOrEqualTo item2.bottom * multiplier - constant @@ -927,7 +927,7 @@ extension ConstraintMaker { /// Make item.leading lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func leading(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .leading, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .leading, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.leading lessThanOrEqualTo item2.leading * multiplier + constant @@ -939,7 +939,7 @@ extension ConstraintMaker { /// Make item.leading lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func leading(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .leading, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .leading, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.leading lessThanOrEqualTo item2.leading * multiplier - constant @@ -955,7 +955,7 @@ extension ConstraintMaker { /// Make item.trailing lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func trailing(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .trailing, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .trailing, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.trailing lessThanOrEqualTo item2.trailing * multiplier + constant @@ -967,7 +967,7 @@ extension ConstraintMaker { /// Make item.trailing lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func trailing(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .trailing, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .trailing, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.trailing lessThanOrEqualTo item2.trailing * multiplier - constant @@ -983,7 +983,7 @@ extension ConstraintMaker { /// Make item.width lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func width(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .width, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .width, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.width lessThanOrEqualTo item2.width * multiplier + constant @@ -995,7 +995,7 @@ extension ConstraintMaker { /// Make item.width lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func width(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .width, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .width, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.width lessThanOrEqualTo item2.width * multiplier - constant @@ -1011,7 +1011,7 @@ extension ConstraintMaker { /// Make item.height lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func height(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .height, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .height, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.height lessThanOrEqualTo item2.height * multiplier + constant @@ -1023,7 +1023,7 @@ extension ConstraintMaker { /// Make item.height lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func height(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .height, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .height, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.height lessThanOrEqualTo item2.height * multiplier - constant @@ -1039,7 +1039,7 @@ extension ConstraintMaker { /// Make item.centerX lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerX(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerX, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerX, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerX lessThanOrEqualTo item2.centerX * multiplier + constant @@ -1051,7 +1051,7 @@ extension ConstraintMaker { /// Make item.centerX lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerX(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerX, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerX, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerX lessThanOrEqualTo item2.centerX * multiplier - constant @@ -1067,7 +1067,7 @@ extension ConstraintMaker { /// Make item.centerY lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerY(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerY, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerY, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerY lessThanOrEqualTo item2.centerY * multiplier + constant @@ -1079,7 +1079,7 @@ extension ConstraintMaker { /// Make item.centerY lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerY(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerY, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerY, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerY lessThanOrEqualTo item2.centerY * multiplier - constant @@ -1095,7 +1095,7 @@ extension ConstraintMaker { /// Make item.lastBaseline lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func lastBaseline(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .lastBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .lastBaseline, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.lastBaseline lessThanOrEqualTo item2.lastBaseline * multiplier + constant @@ -1107,7 +1107,7 @@ extension ConstraintMaker { /// Make item.lastBaseline lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func lastBaseline(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .lastBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .lastBaseline, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.lastBaseline lessThanOrEqualTo item2.lastBaseline * multiplier - constant @@ -1123,7 +1123,7 @@ extension ConstraintMaker { /// Make item.firstBaseline lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func firstBaseline(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .firstBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .firstBaseline, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.firstBaseline lessThanOrEqualTo item2.firstBaseline * multiplier + constant @@ -1135,7 +1135,7 @@ extension ConstraintMaker { /// Make item.firstBaseline lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func firstBaseline(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .firstBaseline, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .firstBaseline, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.firstBaseline lessThanOrEqualTo item2.firstBaseline * multiplier - constant @@ -1151,7 +1151,7 @@ extension ConstraintMaker { /// Make item.centerXWithinMargins lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerXWithinMargins(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerXWithinMargins lessThanOrEqualTo item2.centerXWithinMargins * multiplier + constant @@ -1163,7 +1163,7 @@ extension ConstraintMaker { /// Make item.centerXWithinMargins lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerXWithinMargins(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerXWithinMargins, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerXWithinMargins lessThanOrEqualTo item2.centerXWithinMargins * multiplier - constant @@ -1179,7 +1179,7 @@ extension ConstraintMaker { /// Make item.centerYWithinMargins lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult public func centerYWithinMargins(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, plus constant: CGFloat = 0, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) + return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: constant, priority: priority) } /// Make item.centerYWithinMargins lessThanOrEqualTo item2.centerYWithinMargins * multiplier + constant @@ -1191,7 +1191,7 @@ extension ConstraintMaker { /// Make item.centerYWithinMargins lessThanOrEqualTo item2.attribute * multiplier - constant @discardableResult public func centerYWithinMargins(lessThanOrEqualTo attribute: NSLayoutAttribute, of item2: Item, multiplyBy multiplier: CGFloat = 1, minus constant: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .equal, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) + return makeConstraint(attribute: .centerYWithinMargins, relatedBy: .lessThanOrEqual, toItem: item2, attribute: attribute, multiplier: multiplier, constant: -constant, priority: priority) } /// Make item.centerYWithinMargins lessThanOrEqualTo item2.centerYWithinMargins * multiplier - constant diff --git a/Sources/ConstraintMaker+Helpers.swift b/Sources/ConstraintMaker+Helpers.swift index 342de8a..13dea32 100644 --- a/Sources/ConstraintMaker+Helpers.swift +++ b/Sources/ConstraintMaker+Helpers.swift @@ -26,6 +26,10 @@ import UIKit extension ConstraintMaker { + //-------------------------------------- + // MARK: size + //-------------------------------------- + /// Make item.with equalTo one value @discardableResult public func width(equalTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { @@ -78,6 +82,9 @@ extension ConstraintMaker { .height(equalTo: .height, of: item2, multiplyBy: multiplier, minus: constant, at: priority) } + //-------------------------------------- + // MARK: center + //-------------------------------------- /// Make center (centerX & centerY) equalTo item2.attribute * multiplier + constant @discardableResult @@ -107,22 +114,42 @@ extension ConstraintMaker { .centerY(equalTo: .centerY, of: item2, multiplyBy: multiplier, minus: constant, at: priority) } + //-------------------------------------- + // MARK: aspectRatio + //-------------------------------------- + + /// Make aspect ratio (width:height) equalTo value + @discardableResult + public func aspectRatio(equalTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { + return makeConstraintToItem(attribute: .width, relatedBy: .equal, toAttribute: .height, multiplier: value, constant: 0, priority: priority) + } + + /// Make aspect ratio (width:height) equalTo size.width:size.height + @discardableResult + public func aspectRatio(equalTo size: CGSize, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { + return aspectRatio(equalTo: size.width / size.height, at: priority) + } + } //== ↓ Generated by `swift Scripts/helpers.swift` ↓ == extension ConstraintMaker { + //-------------------------------------- + // MARK: size + //-------------------------------------- + /// Make item.with greaterThanOrEqualTo one value @discardableResult public func width(greaterThanOrEqualTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .width, relatedBy: .equal, constant: value, priority: priority) + return makeConstraint(attribute: .width, relatedBy: .greaterThanOrEqual, constant: value, priority: priority) } /// Make item.height greaterThanOrEqualTo one value @discardableResult public func height(greaterThanOrEqualTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .height, relatedBy: .equal, constant: value, priority: priority) + return makeConstraint(attribute: .height, relatedBy: .greaterThanOrEqual, constant: value, priority: priority) } /// Make item.size (with & height) greaterThanOrEqualTo one value @@ -165,6 +192,9 @@ extension ConstraintMaker { .height(greaterThanOrEqualTo: .height, of: item2, multiplyBy: multiplier, minus: constant, at: priority) } + //-------------------------------------- + // MARK: center + //-------------------------------------- /// Make center (centerX & centerY) greaterThanOrEqualTo item2.attribute * multiplier + constant @discardableResult @@ -194,20 +224,40 @@ extension ConstraintMaker { .centerY(greaterThanOrEqualTo: .centerY, of: item2, multiplyBy: multiplier, minus: constant, at: priority) } + //-------------------------------------- + // MARK: aspectRatio + //-------------------------------------- + + /// Make aspect ratio (width:height) greaterThanOrEqualTo value + @discardableResult + public func aspectRatio(greaterThanOrEqualTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { + return makeConstraintToItem(attribute: .width, relatedBy: .greaterThanOrEqual, toAttribute: .height, multiplier: value, constant: 0, priority: priority) + } + + /// Make aspect ratio (width:height) greaterThanOrEqualTo size.width:size.height + @discardableResult + public func aspectRatio(greaterThanOrEqualTo size: CGSize, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { + return aspectRatio(greaterThanOrEqualTo: size.width / size.height, at: priority) + } + } extension ConstraintMaker { + //-------------------------------------- + // MARK: size + //-------------------------------------- + /// Make item.with lessThanOrEqualTo one value @discardableResult public func width(lessThanOrEqualTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .width, relatedBy: .equal, constant: value, priority: priority) + return makeConstraint(attribute: .width, relatedBy: .lessThanOrEqual, constant: value, priority: priority) } /// Make item.height lessThanOrEqualTo one value @discardableResult public func height(lessThanOrEqualTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { - return makeConstraint(attribute: .height, relatedBy: .equal, constant: value, priority: priority) + return makeConstraint(attribute: .height, relatedBy: .lessThanOrEqual, constant: value, priority: priority) } /// Make item.size (with & height) lessThanOrEqualTo one value @@ -250,6 +300,9 @@ extension ConstraintMaker { .height(lessThanOrEqualTo: .height, of: item2, multiplyBy: multiplier, minus: constant, at: priority) } + //-------------------------------------- + // MARK: center + //-------------------------------------- /// Make center (centerX & centerY) lessThanOrEqualTo item2.attribute * multiplier + constant @discardableResult @@ -279,4 +332,20 @@ extension ConstraintMaker { .centerY(lessThanOrEqualTo: .centerY, of: item2, multiplyBy: multiplier, minus: constant, at: priority) } + //-------------------------------------- + // MARK: aspectRatio + //-------------------------------------- + + /// Make aspect ratio (width:height) lessThanOrEqualTo value + @discardableResult + public func aspectRatio(lessThanOrEqualTo value: CGFloat, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { + return makeConstraintToItem(attribute: .width, relatedBy: .lessThanOrEqual, toAttribute: .height, multiplier: value, constant: 0, priority: priority) + } + + /// Make aspect ratio (width:height) lessThanOrEqualTo size.width:size.height + @discardableResult + public func aspectRatio(lessThanOrEqualTo size: CGSize, at priority: UILayoutPriority = UILayoutPriorityRequired) -> Self { + return aspectRatio(lessThanOrEqualTo: size.width / size.height, at: priority) + } + } \ No newline at end of file diff --git a/Sources/ConstraintMaker.swift b/Sources/ConstraintMaker.swift index 602c6f4..da8b0c7 100644 --- a/Sources/ConstraintMaker.swift +++ b/Sources/ConstraintMaker.swift @@ -29,6 +29,9 @@ public protocol ConstraintMaker { @discardableResult func makeConstraint(attribute: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem item2: Any?, attribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat, priority: UILayoutPriority) -> Self + @discardableResult + func makeConstraintToItem(attribute: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toAttribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat, priority: UILayoutPriority) -> Self + } extension ConstraintMaker { diff --git a/Sources/GroupConstraintMaker.swift b/Sources/GroupConstraintMaker.swift index 76eb722..ea78592 100644 --- a/Sources/GroupConstraintMaker.swift +++ b/Sources/GroupConstraintMaker.swift @@ -31,6 +31,7 @@ public final class GroupConstraintMaker: ConstraintMaker { self.items = items } + @discardableResult public func makeConstraint(attribute: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem item2: Any?, attribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat, priority: UILayoutPriority) -> Self { for item in items { item.makeConstraint(attribute: attribute, relatedBy: relation, toItem: item2, attribute: attr2, multiplier: multiplier, constant: c, priority: priority) @@ -38,6 +39,14 @@ public final class GroupConstraintMaker: ConstraintMaker { return self } + @discardableResult + public func makeConstraintToItem(attribute: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toAttribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat, priority: UILayoutPriority) -> Self { + for item in items { + item.makeConstraint(attribute: attribute, relatedBy: relation, toItem: item, attribute: attr2, multiplier: multiplier, constant: c, priority: priority) + } + return self + } + } extension LayoutManager { diff --git a/Sources/ItemConstraintMaker.swift b/Sources/ItemConstraintMaker.swift index 3727bd1..9750ac6 100644 --- a/Sources/ItemConstraintMaker.swift +++ b/Sources/ItemConstraintMaker.swift @@ -54,4 +54,9 @@ public final class ItemConstraintMaker: ConstraintMaker { return self } + @discardableResult + public func makeConstraintToItem(attribute: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toAttribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat, priority: UILayoutPriority) -> Self { + return makeConstraint(attribute: attribute, relatedBy: relation, toItem: item, attribute: attr2, multiplier: multiplier, constant: c, priority: priority) + } + }