Skip to content

Commit

Permalink
Add aspectRatio helper
Browse files Browse the repository at this point in the history
  • Loading branch information
evan-liu committed Nov 28, 2016
1 parent 8d1dad7 commit 153b57f
Show file tree
Hide file tree
Showing 12 changed files with 165 additions and 72 deletions.
Expand Up @@ -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.
*/
Expand Down
Expand Up @@ -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)
3 changes: 3 additions & 0 deletions Documentation/Doc.xcworkspace/contents.xcworkspacedata

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified Documentation/Images/Helpers.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 6 additions & 4 deletions README.md
Expand Up @@ -12,7 +12,7 @@
`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.

Expand Down Expand Up @@ -50,14 +50,16 @@ demo { canvas, icon1, icon2, icon3 in

### Helpers

- aspectRatio: `width:height`
- size: width & height
- center: centerX & centerY

```swift
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)
}
```

Expand Down
4 changes: 2 additions & 2 deletions Scripts/anchors.swift
Expand Up @@ -78,8 +78,8 @@ func main() {
.map { seedCode.replacingOccurrences(of: seedAnchor, with: $0) }

let equalsString = equals.joined(separator: "\n\n")
let relations = ["greaterThanOrEqualTo", "lessThanOrEqualTo"]
.map { equalsString.replacingOccurrences(of: "equalTo", with: $0) }
let relations = ["greaterThanOrEqual", "lessThanOrEqual"]
.map { equalsString.replacingOccurrences(of: "equalTo", with: "\($0)To").replacingOccurrences(of: ".equal", with: ".\($0)") }

equals.insert("//== ↓ Generated by `swift Scripts/anchors.swift` ↓ ==", at: 1)
let finalCode = header + (equals + relations).joined(separator: "\n\n")
Expand Down
4 changes: 2 additions & 2 deletions Scripts/helpers.swift
Expand Up @@ -54,8 +54,8 @@ func main() {
let header = match[1]
let seedCode = match[2]

let relations = ["greaterThanOrEqualTo", "lessThanOrEqualTo"]
.map { seedCode.replacingOccurrences(of: "equalTo", with: $0) }
let relations = ["greaterThanOrEqual", "lessThanOrEqual"]
.map { seedCode.replacingOccurrences(of: "equalTo", with: "\($0)To").replacingOccurrences(of: ".equal", with: ".\($0)") }

let finalCode = header + ([seedCode, "//== ↓ Generated by `swift Scripts/helpers.swift` ↓ =="] + relations).joined(separator: "\n\n")

Expand Down
112 changes: 56 additions & 56 deletions Sources/ConstraintMaker+Anchors.swift

Large diffs are not rendered by default.

77 changes: 73 additions & 4 deletions Sources/ConstraintMaker+Helpers.swift
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
}

}
3 changes: 3 additions & 0 deletions Sources/ConstraintMaker.swift
Expand Up @@ -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 {
Expand Down
9 changes: 9 additions & 0 deletions Sources/GroupConstraintMaker.swift
Expand Up @@ -31,13 +31,22 @@ 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)
}
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 {
Expand Down
5 changes: 5 additions & 0 deletions Sources/ItemConstraintMaker.swift
Expand Up @@ -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)
}

}

0 comments on commit 153b57f

Please sign in to comment.