Swifty approach to defining frame layouts.
SPM:
.package(url: "https://github.com/ncreated/Framing.git", from: "1.0.0"),
CocoaPods:
pod 'Framing'
Framing
is a tiny framework for defining view frames in more Swifty way. Think of it as a simple wrapper over CGRect
that can save you time spend on math calculations when positioning view frames:
let background = Frame(width: 300, height: 300)
let bottomLine1 = Frame(width: 300, height: 20)
.putInside(background, alignTo: .bottomCenter)
let bottomLine2 = Frame(width: 300, height: 30)
.putAbove(bottomLine1)
let F1 = Frame(width: 50, height: 180)
.putInside(background, alignTo: .middleLeft)
.offsetBy(x: 90, y: -10)
let F2 = Frame(width: 70, height: 50)
.putOnRight(of: F1, alignTo: .top)
let F3 = F2.offsetBy(y: 70)
The Frame
has a .rect
property that returns CGRect
that can be used for UIView
(e.g. greenView.frame = bottomLine2.rect
).
It's not an animal 🐷 or UI / Layout framework. It doesn't import UIKit
anywhere.
This will return frame moved by 10pt
in both directions:
frame.offsetBy(x: 10, y: 10)
This will return frame that is 5pt
smaller in each direction:
frame.inset(top: 5, left: 5, bottom: 5, right: 5)
This will return frame that is put above/below base
frame:
frame.putAbove(base, alignTo: .left)
frame.putAbove(base, alignTo: .right)
frame.putAbove(base, alignTo: .center)
frame.putBelow(..., alignTo: ...) // ...
The same for left/right positioning:
frame.putOnLeft(of: base, alignTo: .top)
frame.putOnLeft(of: base, alignTo: .bottom)
frame.putOnLeft(of: base, alignTo: .middle)
frame.putOnRight(of: ..., alignTo: ...) // ...
This will return frame that is put inside base
frame:
frame.putInside(base, alignTo: .topLeft)
frame.putInside(base, alignTo: .topCenter)
...
frame.putInside(base, alignTo: .middleCenter) // centers `frame` inside `base`
...
This will divide frame into 5 columns and return 2nd column frame:
frame.divideIntoEqual(columns: 5, take: 1)
The same for rows:
frame.divideIntoEqual(rows: 5, take: 1)
It's also possible to apply transforms conditionally:
let shouldBeOffsetted: Bool = ...
frame.if(condition: shouldBeOffsetted,
then: { $0.offsetBy(x: 10).inset(top: 5) },
else: { $0.inset(top: 5) })
// Or simpler:
frame.inset(top: 5)
.if(shouldBeOffsetted) { $0.offsetBy(x: 10) }
Missing some API? Open a Pull Request or fill in the Issue.
Framing
is released under the MIT license. See the LICENSE file for more details.