简体   繁体   English

如何在 iOS 中以编程方式设置纵横比约束?

[英]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.我已经在约束中设置了 V 和 H 位置,但是我想知道当它更改为 5s、6 和 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.但我的问题是,虽然它管理左右侧间隙,但由于高度固定,它在 iPhone 6 和 6 Plus 中被拉伸。 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?我认为这可能是纵横比,但是如何在代码中设置纵横比约束?

Layout Anchors is 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 的纵横比:

结果视图

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.或代替(self.yourview.frame.size.height / self.yourview.frame.size.width)您可以使用任何浮点值。 Thanks.谢谢。

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

Swift 3:斯威夫特 3:

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

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 Agrawal said:或者,正如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]];

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

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

Swift 5 solution, Xcode 12.4. Swift 5 解决方案,Xcode 12.4。 Requires ios 9.0+需要 ios 9.0+

Simply anchor your height constraint to a certain ratio:只需将您的高度限制固定到某个比例:

let aspectRatio: CGFloat = 9 / 16 // Example of ratio you want to apply
yourView.heightAnchor.constraint(equalTo: imageView.widthAnchor,
                                 multiplier: aspectRatio).activate()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何以编程方式将宽高比约束应用于自定义UICollectionViewCell? - How do I apply aspect ratio constraints to a custom UICollectionViewCell programmatically? 如何计算从具有自动布局纵横比约束的xib加载的UICollectionViewCell的大小? - How can I calculate the size of a UICollectionViewCell loaded from a xib with autolayout aspect ratio constraints? iOS:我从网络上获得了许多“ UIImage”,我怎么知道它们的“长宽比”? - iOS: I get many `UIImage` from network, how can I know their `aspect ratio`? 自动布局纵横比约束 - Autolayout aspect ratio constraints 如何使用自动布局保持UITableViewCell的宽高比? - How can I keep an aspect ratio of UITableViewCell using Auto layout? 如何从代码中更改宽高比约束值? - How can I change the aspect ratio constraint value from code? iOS以编程方式在UITableviewcell中打破了宽高比约束 - iOS programmatically aspect ratio constraint gets broken in UITableviewcell 如何在iOS中为图像提供宽高比 - How to give the aspect ratio to images in iOS iOS约束。 如何通过约束将图像视高比设置为等于图像比? - iOS Constraints. How to set image view height ration equal to image ratio by constraints? 如何以编程方式设置这些约束? - How to set these constraints programmatically?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM