如何在 iOS 中以编程方式设置纵横比约束?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31334017/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I set aspect ratio constraints programmatically in iOS?
提问by IRD
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:
我为我的视图控制器使用了自动布局。我已经在约束中设置了 V 和 H 位置,但是我想知道当它更改为 5s、6 和 6 Plus 时如何增加我的按钮大小。这是我为登录按钮添加约束的方式:
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?
但我的问题是,虽然它管理左右侧间隙,但由于高度固定,它在 iPhone 6 和 6 Plus 中被拉伸。如何根据屏幕尺寸增加尺寸?我认为这可能是纵横比,但是如何在代码中设置纵横比约束?
采纳答案by Mahesh Agrawal
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.
或者代替(self.yourview.frame.size.height / self.yourview.frame.size.width)
您可以使用任何浮点值。谢谢。
Swift 3.0 -
斯威夫特 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))
回答by Eugene Brusov
Layout Anchorsis the most convenient way to set constraints programmatically.
布局锚是以编程方式设置约束的最方便的方法。
Say you want to set 5:1 aspect ratio for your button then you should use:
假设你想为你的按钮设置 5:1 的纵横比,那么你应该使用:
button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
Here's the full code:
这是完整的代码:
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
}
}
Here're results achieved with code written above. You can see that button keeps its 5:1 aspect ratio across various devices:
这是使用上面编写的代码实现的结果。您可以看到该按钮在各种设备上保持 5:1 的纵横比:
回答by RNHTTR
Swift 3:
斯威夫特 3:
yourView.addConstraint(NSLayoutConstraint(item: yourView,
attribute: .height,
relatedBy: .equal,
toItem: yourView,
attribute: .width,
multiplier: 9.0 / 16.0,
constant: 0))
回答by Zanael
You can set "Height constraint" at Design-time in Interface Builder. Just check '"Remove at build time", and it removes when App will running.
您可以在设计时在界面生成器中设置“高度约束”。只需选中“在构建时删除”,它就会在应用程序运行时删除。
After that you can add "Aspect Ratio" constraint, for example, in viewDidLoad method.
之后,您可以添加“纵横比”约束,例如,在 viewDidLoad 方法中。
In Xamain.iOS for "16:9" it's looks like this:
在“16:9”的 Xamain.iOS 中,它看起来像这样:
this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create(
this.ImageOfTheDay,
NSLayoutAttribute.Height,
NSLayoutRelation.Equal,
this.ImageOfTheDay,
NSLayoutAttribute.Width,
9.0f / 16.0f,
0));
Or, as Mahesh Agrawalsaid:
或者,正如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]];
回答by Micha? Ziobro
Helper Extension on UIView
UIView 上的辅助扩展
extension UIView {
func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint {
return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0)
}
}
And usage is:
用法是:
view.aspectRation(1.0/1.0).isActive = true
view.aspectRation(1.0/1.0).isActive = true
回答by tuandapen
I have try all answers above but didn't work, and this is my solution with swift 3:
我已经尝试了上面的所有答案,但没有奏效,这是我使用 swift 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()