gpt4 book ai didi

objective-c - 以编程方式使用自动布局约束

转载 作者:太空狗 更新时间:2023-10-30 03:21:09 24 4
gpt4 key购买 nike

我正在尝试以编程方式在我的 iOS 应用程序中使用自动布局。我有一个带有此初始化代码的简单 View Controller

UIView *innerView = [[UIView alloc] initWithFrame:self.view.bounds];

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setFrame:CGRectMake(50, 50, 150, 50)];
[button1 setTitle:@"button1" forState:UIControlStateNormal];

UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setFrame:CGRectMake(250, 50, 150, 50)];
[button2 setTitle:@"button2" forState:UIControlStateNormal];

[innerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[button1][button2(==button1)]|" options:NSLayoutFormatAlignAllBaseline metrics:0 views:NSDictionaryOfVariableBindings(button1, button2)]];

[innerView addSubview:button1];
[innerView addSubview:button2];
[self.view addSubview:innerView];

但是当我尝试运行它时,出现了这个错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 
Unable to interpret '|' character, because the related view doesn't have a superview
|[button1][button2(==button1)]|
^'

这是怎么回事?

当我试图移除 constraintsWithVisualFormat 中的管道时,我收到了这个警告:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x716be10 h=--& v=--& UIRoundedRectButton:0x71631f0.midX == + 325>",
"<NSAutoresizingMaskLayoutConstraint:0x7169940 h=--& v=--& H:[UIRoundedRectButton:0x715fb80(150)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7169860 h=--& v=--& UIRoundedRectButton:0x715fb80.midX == + 125>",
"<NSLayoutConstraint:0x7164cd0 UIRoundedRectButton:0x71631f0.width == UIRoundedRectButton:0x715fb80.width>",
"<NSLayoutConstraint:0x7164940 H:[UIRoundedRectButton:0x715fb80]-(0)-[UIRoundedRectButton:0x71631f0]>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7164940 H:[UIRoundedRectButton:0x715fb80]-(0)-[UIRoundedRectButton:0x71631f0]>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

因此,我的约束根本没有效果。我做错了什么?

最佳答案

你有三个问题:

首先,您需要在您的两个按钮 subview 上选择加入基于布局的约束

[button1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[button2 setTranslatesAutoresizingMaskIntoConstraints:NO];

这将消除 NSAutoresizingMaskLayoutConstraint 错误。现在您可以了解布局约束的情况。

其次,您必须在添加约束之前addSubview。在 button1 和 button2 是 innerview 的 subview 之前,您在 innerView 上调用 addContraints

第三,您应该指定(尽管文档表明它是可选的)布局字符串是垂直的还是水平的。 @"H:|[button1][button2(==button1)]|"。您还需要一个像 @"V:[button1]|" 这样的垂直约束,它将 button1 与 innerview 的底部对齐,因为您已经在按钮上对齐了基线, button2 将跟随。

关于objective-c - 以编程方式使用自动布局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15346260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com