如何以编程方式在ios中设置宽高比约束

我用我的ViewControllers自动布局。 我已经设置了V和H的位置。 但我想知道,如何增加我的button大小,当它变成5秒,6和6加。 这是我为loginbutton添加约束的方式。

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

但是我的问题是什么时候pipe理左右侧的差距。 由于高度固定,它在iphone 6和6 plus中得到了加强。 如何根据屏幕尺寸增加尺寸。 我认为这可能是AspectRatio但如何设置代码中的长宽比约束。

喜欢这个。 尝试一次。

 [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]]; 

或者在(self.yourview.frame.size.height / self.yourview.frame.size.width)的地方,你可以使用任何浮点值。 谢谢。

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

Swift 3:

 yourView.addConstraint(NSLayoutConstraint(item: yourView, attribute: .height, relatedBy: .equal, toItem: yourView, attribute: .width, multiplier: 9.0 / 16.0, constant: 0)) 

您可以在devise时在界面生成器中设置“高度约束”。 只需检查'“在构build时删除”,它将删除应用程序将运行。

在这里输入图像说明 之后,您可以添加“长宽比”约束,例如,在viewDidLoad方法中。

在“16:9”的Xamain.iOS中,它看起来像这样:

  this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create( this.ImageOfTheDay, NSLayoutAttribute.Height, NSLayoutRelation.Equal, this.ImageOfTheDay, NSLayoutAttribute.Width, 9.0f / 16.0f, 0)); 

或者,正如Mahesh Agrawal所说:

  [self.ImageOfTheDay addConstraint:[NSLayoutConstraint constraintWithItem:self.ImageOfTheDay attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.ImageOfTheDay attribute:NSLayoutAttributeWidth multiplier:(9.0f / 16.0f) constant:0]]; 

我已经尝试了所有上面的答案,但没有工作,这是我的解决scheme与迅速3:

 let newConstraint = NSLayoutConstraint(item: yourView, attribute: .width, relatedBy: .equal, toItem: yourView, attribute: .height, multiplier: 560.0/315.0, constant: 0) yourView.addConstraint(newConstraint) NSLayoutConstraint.activate([newConstraint]) NSLayoutConstraint.deactivate(yourView.constraints) yourView.layoutIfNeeded() 

布局锚是以编程方式设置约束的最方便的方式。

假设你想为你的button设置5:1的宽高比,那么你应该使用:

 button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true 

以下是完整的代码:

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = UIButton(type: .custom) button.setTitle("Login", for: .normal) button.backgroundColor = UIColor.darkGray self.view.addSubview(button) button.translatesAutoresizingMaskIntoConstraints = false let margins = view.layoutMarginsGuide button.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20.0).isActive = true button.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: -20.0).isActive = true button.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -20.0).isActive = true button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true } } 

这是用上面编写的代码实现的结果。 您可以看到该button在各种设备上保持5:1的宽高比:

结果视图