在 iOS 8 中以编程方式将视图中的按钮居中使用约束

Posted

技术标签:

【中文标题】在 iOS 8 中以编程方式将视图中的按钮居中使用约束【英文标题】:Centre the button in view use constraints programmatically in iOS 8 【发布时间】:2014-12-14 02:04:07 【问题描述】:

我有一个子视图并添加了 1 个按钮。我想在该视图的中心添加此按钮。我使用自动布局,所以我需要以编程方式设置此按钮的约束。

我试过这段代码,但播放按钮不在中间。

[self.moviePlayer.view addSubview:self.playbtn];


 self.playbtn.translatesAutoresizingMaskIntoConstraints = NO;

[self.moviePlayer.view addConstraint:[NSLayoutConstraint constraintWithItem:self.playbtn attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual
                                           toItem:self.moviePlayer.view attribute:NSLayoutAttributeCenterX multiplier:0.667 constant:0]];

请帮我纠正它。提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用NSLayoutAttributeCenterXNSLayoutAttributeCenterY 属性使播放按钮居中,如下所示:

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self initViews];
    [self initConstraints];


-(void)initViews

    self.picture = [[UIImageView alloc] init];
    self.picture.image = [UIImage imageNamed:@"bg"];

    self.playButton = [[UIButton alloc] init];
    [self.playButton setImage:[UIImage imageNamed:@"playButton"] forState:UIControlStateNormal];

    [self.view addSubview:self.picture];
    [self.view addSubview:self.playButton];


-(void)initConstraints

    self.picture.translatesAutoresizingMaskIntoConstraints = NO;
    self.playButton.translatesAutoresizingMaskIntoConstraints = NO;

    id views = @
                 @"picture": self.picture,
                 @"playButton": self.playButton
                 ;

    // picture constraints
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[picture]|" options:0 metrics:nil views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[picture]|" options:0 metrics:nil views:views]];


    // play button constraints

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.playButton attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.playButton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];

你会得到这样的东西:

【讨论】:

【参考方案2】:

您可以使用此代码在其 superview 中将任何项目(例如 self.btn)居中:

[self.btn.superview addConstraint:[NSLayoutConstraint
    constraintWithItem:self.btn.superview
    attribute:NSLayoutAttributeCenterX
    relatedBy:NSLayoutRelationEqual
    toItem:self.btn
    attribute:NSLayoutAttributeCenterX
    multiplier:1.0
    constant:0.0]];
[self.btn.superview addConstraint:[NSLayoutConstraint
    constraintWithItem:self.btn.superview
    attribute:NSLayoutAttributeCenterY
    relatedBy:NSLayoutRelationEqual
    toItem:self.btn
    attribute:NSLayoutAttributeCenterY
    multiplier:1.0
    constant:0.0]];

我还在博客上写了an article about aligning any UIView objects,但没有使用故事板

【讨论】:

以上是关于在 iOS 8 中以编程方式将视图中的按钮居中使用约束的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 的 Textview 中以编程方式居中文本

自动居中以编程方式创建的 UIButtons

在 iOS 中以编程方式生成视图

为啥在集合视图单元格中以编程方式创建的按钮需要是惰性变量?

如何在 Swift 中以编程方式将 UILabel 对象居中?

如何在ios中以编程方式关闭非页内广告