An incremental linear constraint-solving algorithm (Auto Layout) in Swift.
An incremental linear constraint-solving algorithm (Auto Layout) in Swift, originally from the paper:
Solving Linear Arithmetic Constraints for User Interface Applications (1997)
This repository consists of 3 frameworks:
import Cassowary
import CassowaryUI
let rootSize = CGSize(width: 320, height: 480)
var solver = CassowaryUI.Solver()
try! solver.addConstraints(view1, view2) { v1, v2 in
return [
// `v1` has fixed size (4:3 aspect ratio)
v1.width == rootSize.width - 40,
v1.height == v1.width * 3 / 4,
// `v2` has fixed origin.x & width (flexible in vertical)
v2.width == v1.width,
v1.centerX == rootFrame.width / 2,
v2.centerX == v1.centerX,
// equal spacing (vertical)
v1.top == 40 ~ .high,
v2.top - v1.bottom == v1.top ~ .high,
rootSize.height - v2.bottom == v1.top ~ .high,
]
}
solver.applyLayout()
This will result:
<UIView: 0x7f8f1ee018c0; frame = (0 0; 320 480); layer = <CALayer: 0x608000220800>>
| <UIView: 0x7f8f21001010; frame = (20 40; 280 210); layer = <CALayer: 0x60c000220da0>>
| <UIView: 0x7f8f1ec015c0; frame = (20 290; 280 150); layer = <CALayer: 0x60c000220840>>