7

我以编程方式组合了一个简单的视图控制器,上面只有两个按钮。如果我去老学校并为布局设置框架大小,那么一切都很好。但是,如果我对布局使用自动布局约束,那么按钮会完美显示,但它们不会响应按下。他们甚至没有突出显示。我的 loadview 方法在下面的表单中,使按钮不起作用。如果框架设置代码未注释并且添加的约束被注释掉,则按钮开始按预期响应按下。有谁知道发生了什么?我很想将我的代码库中的所有旧硬编码布局转换为基于约束的,但似乎在第一个障碍中落下。

- (void)loadView {
    self.view = [UIView new];
    self.view.translatesAutoresizingMaskIntoConstraints = NO;

    self.navigationItem.title = @"Landing Page";

    UIButton *buildExercisesButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.buildExercisesButton = buildExercisesButton;
//    buildExercisesButton.frame = CGRectMake(20, 312, 164, 44);
    self.buildExercisesButton.translatesAutoresizingMaskIntoConstraints = NO;
    [self.buildExercisesButton setTitle:@"Build Exercises" forState:UIControlStateNormal];
    [self.buildExercisesButton addTarget:self action:@selector(buildExercisesButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.buildExercisesButton];

    UIButton *organiseExercisesButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.organiseExercisesButton = organiseExercisesButton;
//    organiseExercisesButton.frame = CGRectMake(192, 312, 164, 44);
    self.organiseExercisesButton.translatesAutoresizingMaskIntoConstraints = NO;
    [self.organiseExercisesButton setTitle:@"Organise Exercises" forState:UIControlStateNormal];
    [self.organiseExercisesButton addTarget:self action:@selector(organiseExercisesButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.organiseExercisesButton];

    NSDictionary *variables = NSDictionaryOfVariableBindings(buildExercisesButton, organiseExercisesButton);
    NSArray *constraints =
            [NSLayoutConstraint constraintsWithVisualFormat:@"|-[buildExercisesButton(organiseExercisesButton)]-[organiseExercisesButton]-|"
                                                    options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
                                                    metrics:nil
                                                      views:variables];
    [self.view addConstraints:constraints];

    constraints =
            [NSLayoutConstraint constraintsWithVisualFormat:@"V:[buildExercisesButton]-|"
                                                    options:0
                                                    metrics:nil
                                                      views:variables];
    [self.view addConstraints:constraints];
}

在 viewDidAppear 中,我打印出按钮的框架。他们给出了奇怪的值,我不知道它是否相关。实际上,这些按钮在屏幕中央并排显示。

buildExercisesButton: {{20, -63}, {164, 44}}
organiseExercisesButton: {{192, -63}, {164, 44}}
4

5 回答 5

3

您需要为要添加按钮的视图定义约束或将translatesAutoresizingMaskIntoConstraints属性设置为YES

于 2013-09-12T19:44:19.287 回答
2

如果您正在为自动布局做纯粹的故事板,请尝试增加垂直内容拥抱优先级和垂直压缩阻力优先级:

在此处输入图像描述

于 2015-03-16T01:46:47.023 回答
1

看起来UIButton框架已经离开屏幕了。触摸事件取决于击中那些而不是按钮的图像,这就是它们没有响应的原因。

你为什么使用自动布局而不是设置框架?

于 2013-09-12T18:13:35.587 回答
1

似乎问题出在第二行:

self.view.translatesAutoresizingMaskIntoConstraints = NO;

使用这条线,视图不是全屏的,按预期从左上角开始,而是从靠近中心的某个地方开始。因此,尽管按钮看起来靠近屏幕中心,但它们实际上位于包含视图之外。当我删除这条线时,一切都开始工作了。

我想我发现了一个问题translatesAutoresizingMaskIntoConstraints。尽管您必须将其关闭才能使用约束,但这仅适用于使用约束的确切视图,而不适用于包含视图,除非它也使用约束。在这种情况下,我关闭translatesAutoresizingMaskIntoConstraints了包含视图,但不应该关闭,因为它没有约束。

于 2013-09-12T19:40:32.787 回答
1

我遇到了同样的问题。就我而言:

self.view
 \- ...
  \_self.wrapper
       \_self.button

代码不起作用:

NSDictionary *metrics = @{@"padding":[NSNumber numberWithFloat:kGridPadding]};

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[head]-padding-[wrapper]-|" options:0 metrics:metrics views:views]];

原因是 'wrapper' 的高度为 0,尽管按钮仍然可见。所以它可以通过提供足够的宽度和高度来修复,如下所示:

NSDictionary *metrics = @{@"padding":[NSNumber numberWithFloat:kGridPadding],
                          @"screenHeight":[NSNumber numberWithFloat:self.view.bounds.size.height]};

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[head]-padding-[wrapper(screenHeight)]-|" options:0 metrics:metrics views:views]];

--> 更好的办法是让wrapper的高度自动增加,但我现在不知道怎么做?

于 2013-11-15T08:45:18.873 回答