An incremental linear constraint-solving algorithm (Auto Layout) in Swift.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Cassowary.xcodeproj
CassowaryUI.playground
CassowaryUI.xcodeproj
CassowaryUI.xcworkspace
Sources
Tests
.gitignore
.swiftlint.yml
LICENSE
Makefile
Package.swift
README.md

README.md

Cassowary

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:

  • Simplex: Simplex tableau and its common operations
  • Cassowary: Core constraint-solving algorithm using Simplex
  • CassowaryUI: UIKit/AppKit wrapper on top of Cassowary

How to use

CassowaryUI

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>>

Acknowledgments

References

License

MIT