【问题标题】:Adding constraints programmatically in Objective-C在 Objective-C 中以编程方式添加约束
【发布时间】:2015-08-15 22:33:33
【问题描述】:

我需要以编程方式向UIButton 添加一些约束。 我需要它让它水平居中到超级视图,垂直居中到超级视图,纵横比与其超级视图和纵横比自我。

谁能帮帮我?

谢谢。

【问题讨论】:

标签: ios objective-c


【解决方案1】:

我觉得这个教程最好。

http://www.tutorialspoint.com/ios/ios_auto_layouts.htm

我的要求是设置:

  • 领先空间
  • 顶部空间
  • 固定宽度
  • 固定高度

使用下面的代码添加NSLayoutConstraint我能够实现它

Objective-c

self.btnCoin.translatesAutoresizingMaskIntoConstraints = NO;
/* Leading space to superview */
NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint
                                             constraintWithItem:self.btnCoin attribute:NSLayoutAttributeLeft
                                             relatedBy:NSLayoutRelationEqual toItem:self attribute:
                                             NSLayoutAttributeLeft multiplier:1.0 constant:30];
/* Top space to superview Y*/
NSLayoutConstraint *leftButtonYConstraint = [NSLayoutConstraint
                                             constraintWithItem:self.btnCoin attribute:NSLayoutAttributeTop
                                             relatedBy:NSLayoutRelationEqual toItem:self attribute:
                                             NSLayoutAttributeTop multiplier:1.0f constant:258];
/* Fixed width */
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.btnCoin
                                                                   attribute:NSLayoutAttributeWidth
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:nil
                                                                   attribute:NSLayoutAttributeNotAnAttribute
                                                                  multiplier:1.0
                                                                    constant:35];
/* Fixed Height */
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:self.btnCoin
                                                                    attribute:NSLayoutAttributeHeight
                                                                    relatedBy:NSLayoutRelationEqual
                                                                       toItem:nil
                                                                    attribute:NSLayoutAttributeNotAnAttribute
                                                                   multiplier:1.0
                                                                     constant:12];
/* 4. Add the constraints to button's superview*/
[self addConstraints:@[leftButtonXConstraint, leftButtonYConstraint, widthConstraint, heightConstraint]];

SWIFT:

btnCoin.translatesAutoresizingMaskIntoConstraints = false
// Leading space to superview
let leftButtonXConstraint = NSLayoutConstraint(
    item: btnCoin,
    attribute: .left,
    relatedBy: .equal,
    toItem: self,
    attribute: .left,
    multiplier: 1.0,
    constant: 30)
// Top space to superview Y
let leftButtonYConstraint = NSLayoutConstraint(
    item: btnCoin,
    attribute: .top,
    relatedBy: .equal,
    toItem: self,
    attribute: .top,
    multiplier: 1.0,
    constant: 258)
// Fixed width
let widthConstraint = NSLayoutConstraint(
    item: btnCoin,
    attribute: .width,
    relatedBy: .equal,
    toItem: nil,
    attribute: .notAnAttribute,
    multiplier: 1.0,
    constant: 35)
// Fixed Height
let heightConstraint = NSLayoutConstraint(
    item: btnCoin,
    attribute: .height,
    relatedBy: .equal,
    toItem: nil,
    attribute: .notAnAttribute,
    multiplier: 1.0,
    constant: 12)

在上面的代码中,我设置了左键constraints。这是输出:

【讨论】:

  • 这是什么意思 constant:258,constant:35 etc. 我们如何使用这个数值?
  • NSLayoutAttributeLeft multiplier:1.0 constant:30]; 是控件从左边缘开始的位置 NSLayoutAttributeTop multiplier:1.0f constant:258]; 是控件从顶部开始的位置。
【解决方案2】:

iOS 9+ 提供了更好的选择

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
imageView.translatesAutoresizingMaskIntoConstraints = false;
[self.view addSubview:imageView];

[imageView.widthAnchor constraintEqualToConstant:imageSize.width].active = YES;
[imageView.heightAnchor constraintEqualToConstant:imageSize.height].active = YES;
[imageView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
[imageView.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:25].active = YES;

斯威夫特 4

var imageView = UIImageView(frame: CGRect.zero)
imageView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(imageView)

imageView.widthAnchor.constraint(equalToConstant: imageSize.width).isActive = true
imageView.heightAnchor.constraint(equalToConstant: imageSize.height).isActive = true
imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 25).isActive = true

// OR you can use: NSLayoutConstraint.activate([NSLayoutConstraint]) to activate all at once.

注意:将视图添加到视图层次结构后始终添加约束。

【讨论】:

  • 这样的一个好例子值得十页的文档。开发人员参考有时就像对的详尽化学描述,而您真正需要知道的是如何服用它的简单说明。
  • 阿门 Ugo 的评论。
【解决方案3】:

我会帮你搞定,这样你就可以看到总体思路,否则请使用 Larme 提供的文档。

在您的超级视图(可能是您的视图控制器)中添加约束。

NSLayoutConstraint *centreHorizontallyConstraint = [NSLayoutConstraint
                                      constraintWithItem:self.uiButton
                                      attribute:NSLayoutAttributeCenterX
                                      relatedBy:NSLayoutRelationEqual
                                      toItem:self.view
                                      attribute:NSLayoutAttributeCenterX
                                      multiplier:1.0
                                      constant:0];

[self.view addConstraint:centreHorizontallyConstraint];

如您所见,我们说的是约束 UIButton 的 center x 属性和 View Controllers 视图的 center x 属性,没有额外的偏移(乘数设置为 1.0 和常量 0)。

确保您将其添加到视图控制器的视图而不是按钮,因为此时按钮尚未布局,因此您无法为其添加约束! (如果我在这里错了,请有人纠正我)。我在 viewDidLoad 方法中添加了我的约束。

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2015-09-24
    相关资源
    最近更新 更多