【问题标题】:App crashing while adding constraints programatically以编程方式添加约束时应用程序崩溃
【发布时间】:2015-05-13 03:30:36
【问题描述】:

我正在使用视觉格式来定义约束。目标是在超级视图的底部放置一个 UIView,比如 self.view,高度固定为 40,宽度自动。我已经使用 Storyboard 完成了此操作,但我无法以编程方式完成此操作。这是我写的代码。如果我没有给出固定宽度,应用程序就会崩溃。它因以下约束而崩溃:“H:[redView]|”。如果我将其更改为“H:[redView(100)]”,它就可以工作。我不想使用 self.bounds 并从那里获得宽度。它应该从超级视图的左侧、视图的底部和右侧粘贴。

请帮忙!

NSDictionary *viewsDictionary = @{@"redView":self.redView};


NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]"
                                                                options:0
                                                                metrics:nil
                                                                  views:viewsDictionary];

NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView]|"
                                                                options:0
                                                                metrics:nil
                                                                  views:viewsDictionary];

// 3. Define the redView Position
NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView]|"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];

NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];
[self.redView addConstraints:constraint_H];
[self.redView addConstraints:constraint_V];



[self.view addConstraints:constraint_POS_H];
[self.view addConstraints:constraint_POS_V];

【问题讨论】:

  • 异常信息应该很清楚了。

标签: ios objective-c ios7 autolayout


【解决方案1】:

您需要先将redView 添加到其超级视图。 此外,约束要添加到超级视图,而不是redView

[self.view addSubview:self.redView];

// create your constraints here

[self.view addConstraints:@[constraint_H, constraint_V, constraint_POS_V, constraint_POS_H]];
[self.view updateConstraintsIfNeeded];

【讨论】:

    【解决方案2】:

    在视觉约束语法中,| 指的是父视图。之前你有那个水平约束的方式,将它添加到redview,它被解释为redview有一个孩子,叫同样的,显然不存在,所以它崩溃了。

    垂直约束之所以起作用,是因为它不引用父视图。

    你可以稍微修改一下你的代码,让约束更加清晰:

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]|" options:0 metrics:nil
                                                                          views:viewsDictionary];
    
    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]|" options:0 metrics:nil
                                                                          views:viewsDictionary];
    
    [self.view addConstraints:horizontalConstraints];
    [self.view addConstraints:verticalConstraints];
    

    请记住,您应该始终将UIView 的约束添加到它的superview

    【讨论】:

      【解决方案3】:

      如果你想获取视图的宽度并将其应用于红色视图,你只需要添加这样的约束:

      NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[redView]-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:viewsDictionary];
      

      【讨论】:

        【解决方案4】:

        改变这一行

        [self.redView addConstraints:constraint_V];
        

        [self.view addConstraints:constraint_V];
        

        自己解决了。谢谢我..:)

        【讨论】:

          猜你喜欢
          • 2014-01-05
          • 2021-12-26
          • 1970-01-01
          • 2020-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多