将 UIImageView 与自动布局对齐

Posted

技术标签:

【中文标题】将 UIImageView 与自动布局对齐【英文标题】:Aligning a UIImageView with Auto Layout 【发布时间】:2014-01-31 18:48:14 【问题描述】:

我想要的是将图像添加为子视图,然后将其沿 X 轴居中对齐,距离父视图底部 10 个点。我只需要使用自动布局,最好使用视觉格式化语言。

- (void)viewDidLoad

    [super viewDidLoad];

    self.imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
    [self.imageView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.imageView setImage:[UIImage imageNamed:@"06-arrow-south"]];
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.view addSubview:self.imageView];
    [self addConstraints];

    self.imageView.layer.borderColor = [[UIColor redColor] CGColor];

    self.imageView.layer.borderWidth = 1.0;


- (void)addConstraints 

    NSDictionary *viewsDictionary = @@"arrowImage":self.imageView;

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[arrowImage(==40)]-|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewsDictionary]];

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[arrowImage(==40)]-10-|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewsDictionary]];

这是我得到的:

【问题讨论】:

【参考方案1】:
V:|-[arrowImage]-10-|

这会对齐图像视图,使其距父视图顶部为标准长度 (20pt),距底部为 10。您想要的只是将其固定到底部:

V:[arrowImage]-10-|

我不确定超级视图中的居中是否可以通过视觉格式完成,但您可以创建一个约束来居中:

[self.view addConstraint:
 [NSLayoutConstraint
  constraintWithItem:self.imageView
  attribute:NSLayoutAttributeCenterX
  relatedBy:NSLayoutRelationEqual
  toItem:self.view
  attribute:NSLayoutAttributeCenterX
  multiplier:1
  constant:0]];

不需要设置图像视图的高度或宽度;它的大小将由它的内容决定。

所以,这是您的 addConstraints 方法的完整代码:

- (void)addConstraints 

    [self.view addConstraint:
     [NSLayoutConstraint
      constraintWithItem:self.imageView
      attribute:NSLayoutAttributeCenterX
      relatedBy:NSLayoutRelationEqual
      toItem:self.view
      attribute:NSLayoutAttributeCenterX
      multiplier:1
      constant:0]];

    NSDictionary *viewsDictionary = @@"arrowImage":self.imageView;

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[arrowImage]-10-|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewsDictionary]];

【讨论】:

【参考方案2】:

您当前所做的是说 arrowImage 应该是视图的完整大小,在左侧、右侧和顶部减去 20px,但从底部减去 10px。

以 x 为中心执行以下操作。

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

然后正如@Austin 指出的那样,去掉从顶部减去 8 和从底部减去 10 的需要:

V:[arrowImage]-10-|

顺便说一句,当您将同级视图连接到父级时,默认值为负 20:(请参阅下面的评论)

|-[

【讨论】:

澄清点:8 是兄弟视图之间的默认值; 20 是父/子视图之间的默认值。 干杯老兄,你知道的越多! 谢谢大家,这有帮助

以上是关于将 UIImageView 与自动布局对齐的主要内容,如果未能解决你的问题,请参考以下文章

您如何应用自动布局约束来将标签与背景图像元素对齐?

如何使用自动布局将两个具有动态高度的 UILabel 与 UICollectionViewCell 的底部对齐

父视图中容器视图的自动布局未与布局指南对齐

iOS自动布局:将UILabel的左边缘与容器中的水平中心对齐?

使用自动布局将 3 个按钮与目标 C 中的动态内容对齐

代码中的 UIImageView 和自动布局