NSLayoutConstraint 的问题

Posted

技术标签:

【中文标题】NSLayoutConstraint 的问题【英文标题】:Problems with NSLayoutConstraint 【发布时间】:2013-11-12 07:24:31 【问题描述】:

我想在我的主窗口顶部显示一个简单的标签栏。 这是我使用的代码:

UIView* tabBar = [[UIView alloc] init];
tabBar.backgroundColor = [UIColor redColor];
tabBar.translatesAutoresizingMaskIntoConstraints = false;

  [self.view addConstraint:
      [NSLayoutConstraint constraintWithItem:tabBar
                                   attribute:NSLayoutAttributeWidth
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.view 
                                   attribute:NSLayoutAttributeWidth
                                  multiplier:0
                                    constant:0]];
  [self.view addConstraint:
      [NSLayoutConstraint constraintWithItem:tabBar 
                                   attribute:NSLayoutAttributeTop
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.view
                                   attribute:NSLayoutAttributeTop
                                  multiplier:1.0f
                                    constant:0]];
  [self.view addConstraint:
      [NSLayoutConstraint constraintWithItem:tabBar
                                   attribute:NSLayoutAttributeBottom
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.view
                                   attribute:NSLayoutAttributeTop
                                  multiplier:1.0f
                                    constant:40]];

但是标签栏无法显示。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

至少在这段代码中,您还没有将标签栏添加到视图中。您还没有指定水平 位置(您有宽度,但没有位置,因此视图将位于屏幕边缘的一半)。

视觉格式语言将使设置更容易:水平为@"|[tabBar]|",垂直为@"V:|[tabBar(==40)]"。对于 VFL 无法处理的事情,您只需要使用冗长的单独约束方法即可。

【讨论】:

【参考方案2】:

我发现了三个错误:

1.在添加任何约束之前,您需要在视图层次结构中添加视图。

tabBar.translatesAutoresizingMaskIntoConstraints = false;
[self.view addSubview:tabBar];

2.First 约束乘数 == 0 它告诉 tabBar.width == 0 个点;

3.last 约束想要的样子。

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:tabBar
                                   attribute:NSLayoutAttributeWidth
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:nil
                                   attribute:NSLayoutAttributeNotAnAttribute
                                  multiplier:1.0f
                                    constant:40]];

或者只是按照@jrturton 的建议使用 constraintsWithVisualFormat 方法。

【讨论】:

以上是关于NSLayoutConstraint 的问题的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 的问题

NSLayoutConstraint 激活/停用

如何创建返回 NSLayoutConstraint 的函数

旋转设备后 safeAreaLayoutGuide 未更新

无法获取 NSLayoutConstraint 的约束

错误的 NSLayoutConstraint 导致黑屏