# KVConstraintKit
[](https://travis-ci.org/keshavvishwkarma/KVConstraintKit)
[](http://cocoapods.org/pods/KVConstraintKit)
[](https://github.com/Carthage/Carthage)


[](http://cocoapods.org/pods/KVConstraintKit)
[](http://cocoapods.org/pods/KVConstraintKit)
KVConstraintKit is a DSL to make easy & impressive Auto Layout constraints on iOS, tvOS & OSX with Swift

## Installation
### Using CocoaPods
1. To integrate `KVConstraintKit` into your Xcode project using [CocoaPods](http://cocoapods.org), specify it to a target in your [Podfile](https://guides.cocoapods.org/using/the-podfile.html):
```ruby
use_frameworks!
pod 'KVConstraintKit', '~> 2.1'
```
If you want to be on the bleeding edge, replace the last line with:
```ruby
pod 'KVConstraintKit', :git => 'https://github.com/keshavvishwkarma/KVConstraintKit.git', :branch => 'master'
```
2. Run `pod install` and open the open the `{Project}.xcworkspace` instead of the `{Project}.xcodeproj` file to launch Xcode.
### Using Carthage
1. To integrate KVConstraintKit into your Xcode project using Carthage, specify it in your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile):
```ogdl
github "keshavvishwkarma/KVConstraintKit" ~> 2.1
```
2. Run `carthage update` and follow [the additional steps](https://github.com/Carthage/Carthage#getting-started) in order to add `KVConstraintKit` to your project.
## Auto Layout Attributes
`KVConstraintKit` supports all built-in layout attributes as of iOS, tvOS & OSX, see the [NSLayoutAttribute](https://developer.apple.com/documentation/uikit/nslayoutconstraint.attribute) enum.
## Usage
Here's a quick example:
##### Without Using KVConstraintKit
```swift
let v = UIView.prepareAutoLayoutView()
v.backgroundColor = UIColor.red
view.addSubview(v)
// Prepare constraints and then add them on superview of view
let top = NSLayoutConstraint( item: v, attribute: .top,
relatedBy: .equal,
toItem: v.superview!, attribute: .top,
multiplier: 1.0, constant: 0)
let leading = NSLayoutConstraint( item: v, attribute: .leading,
relatedBy: .equal,
toItem: v.superview!, attribute: .leading,
multiplier: 1.0, constant: 0)
let trailing = NSLayoutConstraint( item: v, attribute: .trailing,
relatedBy: .equal,
toItem: v.superview!, attribute: .trailing,
multiplier: 1.0, constant: 0)
let bottom = NSLayoutConstraint( item: v, attribute: .bottom,
relatedBy: .equal,
toItem: v.superview!, attribute: .bottom,
multiplier: 1.0, constant: 0)
v.superview?.addConstraints([top, leading, trailing, bottom])
```
##### Using KVConstraintKit
```swift
v +== [.top, .leading, .trailing, .bottom]
```
##### Similarly for margin constraints
```swift
v +== [ .leadingMargin, .trailingMargin, .topMargin, .bottomMargin]
```
### Fit
Horizontally
```swift
view.fitHorizontallyToSuperview()
OR
view.fitHorizontallyToSuperview(20) // padding
```
Vertically
```swift
view.fitVerticallyToSuperview()
OR
view.fitVerticallyToSuperview(20) // padding
```
Horizontally & Vertically
```swift
view.fitToSuperview()
OR
view.fitToSuperview(20) // width same padding for all edge
```
Fit with inset
```swift
let inset = UIEdgeInsets(top: 4, left: 8, bottom: 12, right: 16)
view.fitToSuperview(contentInset:inset)
```
### Center
Horizontally
```swift
view.applyCenterX()
OR
view.applyCenterX(20) // X offset
```
Vertically
```swift
view.applyCenterY()
OR
view.applyCenterY(20) // Y offset
```
Horizontally & Vertically
```swift
view.applyCenter()
OR
view.applyCenter(CGPoint(x:20, y:20)) // XY offset
OR
view.applyCenterX(4).applyCenterY(16) // XY offset
```
### Size
Width
```swift
view.applyWidth(100)
OR
view.applyAtLeastWidth(100)
OR
view.applyAtMostWidth(100)
```
Height
```swift
view.applyHeight(100)
OR
view.applyAtLeastHeight(100)
OR
view.applyAtMostHeight(100)
```
Aspact Ratio
```swift
view.applyAspectRatio()
```
#### Quick Reference
| Layout Attributes |
Using Operator |
Using Method |
Leading |
(subview +== .leading).constant = 20 |
subview.applyLeading(20) |
Trailing |
(subview +== .trailing).constant = 20 |
subview.applyTrailing(20) |
Top |
(subview +== .top).constant = 20 |
subview.applyTop(20) |
Bottom |
(subview +== .bottom).constant = 20 |
subview.applyBottom(20) |
CenterX |
subview +== .centerX |
subview.applyCenterX() |
CenterY |
subview +== .centerY |
subview.applyCenterY() |
Height |
subview +== (.height, 100) |
subview.applyHeight(100) |
Width |
subview +== (.width, 100) |
subview.applyWidth(100) |
CenterX & CenterY |
subview +== [.centerX, .centerY] |
subview.applyCenter() |
For more details see the [ApplyViewConstraint](./KVConstraintKit/ApplyViewConstraint.swift) extension and [LayoutRelationable Protocol](./KVConstraintKit/KVConstraintKitProtocol.swift) of `KVConstraintKit`.
**Note:** Avoid using **Left** and **Right** attributes. Use **Leading** and **Trailing** instead. This allows the layout to adapt to the view’s reading direction. By default the reading direction is determined based on the current language set by the user.
## Custom Operators
The following types of `operators` are provided by `KVConstraintKit`, to `add`, `remove`, `access` and `modify` constraints.
| Operator | Meaning |
| :--------: |-------|
| + | to `add` constraint |
| - | to `remove` constraint |
| * | to modify `multiplier` of constraint |
| ~ | to modify `Priority` ( **UILayoutPriority** ), `Relation` ( **NSLayoutRelation** ) & `Replace` constraint|
| <- | to access constraint by attributes ( **eg. NSLayoutAttribute.Height** ) |
| +== | to add equal relation ( **NSLayoutRelation.Equal** ) constraint |
| +>= | to add greater than or equal relation ( **NSLayoutRelation.GreaterThanOrEqual** ) constraint |
| +<= | to add less than or equal relation ( **NSLayoutRelation.LessThanOrEqual** ) constraint |
| *== | to add equal relation constraint with `multiplier` |
| *>= | to add greater than or equal relation constraint with `multiplier` |
| *<= | to add less than or equal relation constraint with `multiplier` |
| |==| | to add or equal relation constraint between sibling views |
| |>=| | to add greater than or equal relation constraint between sibling views |
| |<=| | to add less than or equal relation constraint between sibling views |
## License
`KVConstraintKit` is available under the MIT license. See the LICENSE file for more info.
## Contributions
Any contribution is more than welcome! You can contribute through pull requests and issues on GitHub.
## Author
If you wish to contact me, email at: keshavvbe@gmail.com