Search code examples
iosautolayoutconstraintsnslayoutconstraint

How can I set aspect ratio constraints programmatically in iOS?


I have used auto layout for my view controllers. I have set the V and H positions in constraints, but I want to know how can I increase my button size when it changes to 5s, 6 and 6 Plus. This is the way I added constraints for the login button:

NSArray *btncon_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnLogin(40)]" options:0 metrics:nil views:viewsDictionary];
[btnLogin addConstraints:btncon_V];

NSArray *btncon_POS_H=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[btnLogin]-100-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_H];


NSArray *btncon_POS_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[Title]-130-[lblFirst]-0-[lblSecond]-20-[textusername]-10-[txtpassword]-10-[btnLogin]" options:0 metrics:nil views:viewsDictionary];

[self.view addConstraints:btncon_POS_V];

But my problem is that while it manages the left and right side gap, it's getting stretched in iPhone 6 and 6 Plus since the height is fixed. How can I increase the size according to the screen size? I think this might be the aspect ratio, but how can I set the aspect ratio constraint in code?


Solution

  • Like this. Try once.

    [self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.yourview addConstraint:[NSLayoutConstraint
                                      constraintWithItem:self.yourview
                                      attribute:NSLayoutAttributeHeight
                                      relatedBy:NSLayoutRelationEqual
                                      toItem:self.yourview
                                      attribute:NSLayoutAttributeWidth
                                      multiplier:(self.yourview.frame.size.height / self.yourview.frame.size.width)
                                      constant:0]];
    

    or in the place of (self.yourview.frame.size.height / self.yourview.frame.size.width) you can use any float value. Thanks.

    Swift 3.0 -

    self.yourview!.translatesAutoresizingMaskIntoConstraints = false
    self.yourview!.addConstraint(NSLayoutConstraint(item: self.yourview!,
                                              attribute: NSLayoutAttribute.height,
                                              relatedBy: NSLayoutRelation.equal,
                                              toItem: self.yourview!,
                                              attribute: NSLayoutAttribute.width,
                                              multiplier: self.yourview.frame.size.height / self.yourview.frame.size.width,
                                              constant: 0))