Mag 1.0.1

Mag 1.0.1

Kyohei Ito维护。



Mag 1.0.1

  • Kyohei Ito

🧲Mag

Carthage compatible Build Status codecov Version License Platform

Mag是一个框架,它封装了NSLayoutAnchor

安装

CocoaPods

将以下内容添加到您的Podfile

pod "Mag"

Carthage

将以下内容添加到您的Cartfile

github "cats-oss/Mag"

示例

let redView = UIView(frame: .zero)
redView.backgroundColor = .red
view.addSubview(redView)
redView.sizeAnchor == CGSize(width: 100, height: 100)
redView.leadingAnchor == view.leadingAnchor + 100
redView.topAnchor == (view.bottomAnchor - 100) * 0.5 ~ 999

let label = UILabel(frame: .zero)
label.text = "Example"
label.textAlignment = .center
redView.addSubview(label)
label.edgeAnchor == redView.edgeAnchor

let blueView = UIView(frame: .zero)
blueView.backgroundColor = .blue
view.addSubview(blueView)
blueView.sizeAnchor == redView.sizeAnchor
blueView.centerAnchor == redView.centerAnchor + CGPoint(x: 100, y: -100)

Example

使用

对齐

redView.leadingAnchor == view.leadingAnchor + 10
// redView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10)

redView.topAnchor >= view.bottomAnchor
// redView.topAnchor.constraint(greaterThanOrEqualTo: view.bottomAnchor, constant: 0)

redView.centerYAnchor <= view.centerYAnchor - 20
// redView.centerYAnchor.constraint(lessThanOrEqualTo: view.centerYAnchor, constant: -20)

blueView.centerAnchor == redView.centerAnchor + CGPoint(x: 100, y: -100)
// blueView.centerXAnchor.constraint(equalTo: redView.centerXAnchor, constant: 100)
// blueView.centerYAnchor.constraint(equalTo: redView.centerYAnchor, constant: -100)

label.horizontalAnchor == redView.horizontalAnchor + UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
// label.leadingAnchor.constraint(equalTo: redView.leadingAnchor, constant: 10)
// label.trailingAnchor.constraint(equalTo: redView.trailingAnchor, constant: -10)

label.verticalAnchor == redView.verticalAnchor + UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
// label.topAnchor.constraint(equalTo: redView.topAnchor, constant: 5),
// label.bottomAnchor.constraint(equalTo: redView.bottomAnchor, constant: -5)

label.edgeAnchor == redView.edgeAnchor + UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
// label.topAnchor.constraint(equalTo: redView.topAnchor, constant: 5),
// label.bottomAnchor.constraint(equalTo: redView.bottomAnchor, constant: -5)
// label.leadingAnchor.constraint(equalTo: redView.leadingAnchor, constant: 10)
// label.trailingAnchor.constraint(equalTo: redView.trailingAnchor, constant: -10)

redView.topAnchor == view.bottomAnchor * 0.5
// redView.topAnchor.constraint(equalTo: view.bottomAnchor, constant: 0)
// multiplying 0.5

尺寸

redView.widthAnchor == 100
// redView.widthAnchor.constraint(equalToConstant: 100)

redView.heightAnchor >= 200
// redView.heightAnchor.constraint(greaterThanOrEqualToConstant: 200)

redView.widthAnchor <= 200
// redView.widthAnchor.constraint(lessThanOrEqualToConstant: 200)

redView.sizeAnchor == CGSize(width: 100, height: 200)
// redView.widthAnchor.constraint(equalToConstant: 100)
// redView.heightAnchor.constraint(equalToConstant: 200)

blueView.sizeAnchor <= redView.sizeAnchor + CGSize(width: 20, height: 0)
// blueView.widthAnchor.constraint(lessThanOrEqualTo: redView.widthAnchor, constant: 20)
// blueView.heightAnchor.constraint(lessThanOrEqualTo: redView.heightAnchor, constant: 0)

redView.sizeAnchor == view.sizeAnchor * 0.5
// redView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5, constant: 0)
// redView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.5, constant: 0)

优先级

redView.topAnchor == view.topAnchor ~ .defaultHigh
// constraint.priority = .defaultHigh

redView.centerAnchor == view.centerAnchor ~ 900
// constraint.priority = UILayoutPriority(Float(900)) (or NSLayoutConstraint.Priority)

约束

比较操作符返回 NSLayoutConstraint

let constraint = redView.leadingAnchor == view.leadingAnchor
// returns NSLayoutConstraint
constraint.isActive = true

如果目标锚点是组合锚点,则返回多个 NSLayoutConstraint。例如:[NSLayoutConstraint]

let constraints = redView.centerAnchor == view.centerAnchor
// returns [NSLayoutConstraint]
NSLayoutConstraint.activate(constraints)

如果 NSLayoutConstraint 中的 firstItemUIView (或 NSView),则将 translatesAutoresizingMaskIntoConstraints 设置为 false

激活

比较操作符返回尚未激活的 NSLayoutConstraint

如果没有激活就销毁约束,则它将被自动激活。

_ = redView.leadingAnchor == view.leadingAnchor
// NSLayoutConstraint activates automatically

如果您想手动激活,可以将 isActivate 设置为 true 或执行激活方法。

单个约束

var constraint: NSLayoutConstraint? {
    didSet {
        oldValue?.isActivate = false
        constraint?.isActivate = true
    }
}

constraint = redView.leadingAnchor == view.leadingAnchor

多个约束

Mag 扩展了 NSLayoutConstraint 的启用和禁用方法。

var constraints: [NSLayoutConstraint] = [] {
    didSet {
        NSLayoutConstraint.deactivate(oldValue, beforeActivate: constraints)
    }
}

constraints = redView.centerAnchor == view.centerAnchor

以下过程相同。

var constraints: [NSLayoutConstraint] = []
constraints.replaceActivatedConstraints(redView.centerAnchor == view.centerAnchor)

许可证

基于MIT许可证。详细信息请参阅LICENSE文件。