How to Create layout constraints programmatically
To fix a view to the bottom of the screen you need following constraints to set.
- Leading Constraint with respect of Parent View for - X
- Trailing Constraint with respect of Parent View for - Width
- Bottom Constraint with respect of Parent View for - Y
- Height Constraint attached to self for - Height.
Lets add.
UIView *subView=bottomView;
UIView *parent=self.view;
subView.translatesAutoresizingMaskIntoConstraints = NO;
//Trailing
NSLayoutConstraint *trailing =[NSLayoutConstraint
constraintWithItem:subView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:parent
attribute:NSLayoutAttributeTrailing
multiplier:1.0f
constant:0.f];
//Leading
NSLayoutConstraint *leading = [NSLayoutConstraint
constraintWithItem:subView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:parent
attribute:NSLayoutAttributeLeading
multiplier:1.0f
constant:0.f];
//Bottom
NSLayoutConstraint *bottom =[NSLayoutConstraint
constraintWithItem:subView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:parent
attribute:NSLayoutAttributeBottom
multiplier:1.0f
constant:0.f];
//Height to be fixed for SubView same as AdHeight
NSLayoutConstraint *height = [NSLayoutConstraint
constraintWithItem:subView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0
constant:ADHeight];
//Add constraints to the Parent
[parent addConstraint:trailing];
[parent addConstraint:bottom];
[parent addConstraint:leading];
//Add height constraint to the subview, as subview owns it.
[subView addConstraint:height];
Hope this helps.
Cheers.
Small extension for previous answer because addConstraint
will be deprecated in future. Here is an extension for UI view. Use these functions after you added view to hierarchy.
OBJC
@implementation UIView (Constraints)
-(void)addConstaintsToSuperviewWithLeftOffset:(CGFloat)leftOffset topOffset:(CGFloat)topOffset {
self.translatesAutoresizingMaskIntoConstraints = false;
[[NSLayoutConstraint constraintWithItem: self
attribute: NSLayoutAttributeLeading
relatedBy: NSLayoutRelationEqual
toItem: self.superview
attribute: NSLayoutAttributeLeading
multiplier: 1
constant: leftOffset] setActive:true];
[[NSLayoutConstraint constraintWithItem: self
attribute: NSLayoutAttributeTop
relatedBy: NSLayoutRelationEqual
toItem: self.superview
attribute: NSLayoutAttributeTop
multiplier: 1
constant: topOffset] setActive:true];
}
-(void)addConstaintsWithWidth:(CGFloat)width height:(CGFloat)height {
self.translatesAutoresizingMaskIntoConstraints = false;
[[NSLayoutConstraint constraintWithItem: self
attribute: NSLayoutAttributeWidth
relatedBy: NSLayoutRelationEqual
toItem: nil
attribute: NSLayoutAttributeNotAnAttribute
multiplier: 1
constant: width] setActive:true];
[[NSLayoutConstraint constraintWithItem: self
attribute: NSLayoutAttributeHeight
relatedBy: NSLayoutRelationEqual
toItem: nil
attribute: NSLayoutAttributeNotAnAttribute
multiplier: 1
constant: height] setActive:true];
}
@end
Swift 3
extension UIView {
public func addConstaintsToSuperview(leftOffset: CGFloat, topOffset: CGFloat) {
self.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint(item: self,
attribute: .leading,
relatedBy: .equal,
toItem: self.superview,
attribute: .leading,
multiplier: 1,
constant: leftOffset).isActive = true
NSLayoutConstraint(item: self,
attribute: .top,
relatedBy: .equal,
toItem: self.superview,
attribute: .top,
multiplier: 1,
constant: topOffset).isActive = true
}
public func addConstaints(height: CGFloat, width: CGFloat) {
self.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint(item: self,
attribute: .height,
relatedBy: .equal,
toItem: nil,
attribute: .notAnAttribute,
multiplier: 1,
constant: height).isActive = true
NSLayoutConstraint(item: self,
attribute: .width,
relatedBy: .equal,
toItem: nil,
attribute: .notAnAttribute,
multiplier: 1,
constant: width).isActive = true
}
}
Also since iOS 9 it could be done super simple with anchors:
Swift 3
extension UIView {
func addConstaintsToSuperview(leadingOffset: CGFloat, topOffset: CGFloat) {
guard superview != nil else {
return
}
translatesAutoresizingMaskIntoConstraints = false
leadingAnchor.constraint(equalTo: superview!.leadingAnchor,
constant: leadingOffset).isActive = true
topAnchor.constraint(equalTo: superview!.topAnchor,
constant: topOffset).isActive = true
}
func addConstaints(height: CGFloat, width: CGFloat) {
heightAnchor.constraint(equalToConstant: height).isActive = true
widthAnchor.constraint(equalToConstant: width).isActive = true
}
}
OBJC category
@implementation UIView (Constraints)
-(void)addConstaintsToSuperviewWithLeadingOffset:(CGFloat)leadingOffset topOffset:(CGFloat)topOffset
{
if (self.superview == nil) {
return;
}
self.translatesAutoresizingMaskIntoConstraints = false;
[[self.leadingAnchor constraintEqualToAnchor:self.superview.leadingAnchor
constant:leadingOffset] setActive:true];
[[self.topAnchor constraintEqualToAnchor:self.superview.topAnchor
constant:topOffset] setActive:true];
}
-(void)addConstaintsWithHeight:(CGFloat)height width:(CGFloat)width
{
[[self.heightAnchor constraintEqualToConstant:height] setActive:true];
[[self.widthAnchor constraintEqualToConstant:width] setActive:true];
}
@end
You can use autolayout constraints programmatically like below
fileprivate func setupName(){
let height = CGFloat(50)
lblName.text = "Hello world"
lblName.backgroundColor = .lightGray
//Step 1
lblName.translatesAutoresizingMaskIntoConstraints = false
//Step 2
self.view.addSubview(lblName)
//Step 3
NSLayoutConstraint.activate([
lblName.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),
lblName.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor),
lblName.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,constant: -height),
lblName.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor),
])
}
Output screenshot