我已经以编程方式组合了一个简单的视图控制器,上面只有两个按钮。如果我去学校并为布局设置框架大小,那么一切都很好。但是,如果我对布局使用自动布局约束,则按钮显示完美,但它们不响应按下。他们甚至没有强调。我的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}}
答案 0 :(得分:2)
您需要为要添加按钮的视图定义约束,或将translatesAutoresizingMaskIntoConstraints
属性设置为YES
。
答案 1 :(得分:1)
看起来UIButton
帧不在屏幕上。触摸事件取决于击中那些不是按钮的图像,这就是他们没有响应的原因。
为什么使用自动布局而不是设置框架?
答案 2 :(得分:1)
问题似乎是第二行:
self.view.translatesAutoresizingMaskIntoConstraints = NO;
使用此行视图不是全屏,从预期的左上角开始,但是从中心附近的某处开始。因此,虽然按钮看起来靠近屏幕的中心,但实际上它们位于包含视图之外。当我删除这一行时,一切都开始起作用了。
我想我发现了translatesAutoresizingMaskIntoConstraints
的问题。虽然您必须将其关闭以使用约束,但这仅限于使用约束的精确视图,而不是包含视图,除非它也使用约束。在这种情况下,我关闭了包含视图的translatesAutoresizingMaskIntoConstraints
,但不应该因为它没有限制它。
答案 3 :(得分: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]];
- >更好的方法是让包装纸的高度自动增加,但我现在不知道怎么做?
答案 4 :(得分:1)
如果您正在为自动布局做纯粹的故事板,请尝试增加垂直内容拥抱优先级和垂直压缩阻力优先级: