为什么项目在视图之外?
Why are items outside the view?
我在一个 UIView 中有两个按钮,然后我将视图添加到主视图,但我最终得到了这样的东西:
如您所见,这两个按钮超出了红色视图。
我想要顶部有一点边距,所以我使用 constraintsWithVisualFormat:@"V:|-100-[buttonGroup]-10-|"
,我不确定这是否重要。
原代码如下:
- (UIButton*) getButtonWithTitle: (NSString*) title
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.layer.borderColor = [UIColor blackColor].CGColor;
button.layer.borderWidth = 0.5f;
button.layer.cornerRadius = 2.0f;
[button setTranslatesAutoresizingMaskIntoConstraints:NO];
[button setTitle:title forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState: UIControlStateNormal];
return button;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
UIButton *loginBtn = [self getButtonWithTitle:@"Login"];
UIButton *registerBtn = [self getButtonWithTitle:@"Register"];
UIView *buttonGroup = [[UIView alloc] init];
[buttonGroup setTranslatesAutoresizingMaskIntoConstraints:NO];
[buttonGroup addSubview: loginBtn];
[buttonGroup addSubview: registerBtn];
[self.view addSubview: buttonGroup];
[buttonGroup setBackgroundColor:[UIColor redColor]];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(loginBtn, registerBtn, buttonGroup);
[buttonGroup addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[loginBtn]-20-[registerBtn(==loginBtn)]-|"
options:0
metrics:nil
views:viewsDictionary
]];
NSArray *verticalConstraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-100-[buttonGroup]-10-|"
options:0
metrics:nil
views:viewsDictionary];
NSArray *horizontalConstraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[buttonGroup]-|"
options:0
metrics:nil
views:viewsDictionary];
[self.view addConstraints: horizontalConstraints];
[self.view addConstraints: verticalConstraints];
}
编辑
我添加的约束:
[buttonGroup addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[loginBtn]-|"
options:0
metrics:nil
views:viewsDictionary
]];
[buttonGroup addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[registerBtn]-|"
options:0
metrics:nil
views:viewsDictionary
]];
看来我做了额外的工作...
您从未在按钮和按钮组之间创建任何垂直约束;添加那些,你应该很好。此外,您不应将控制器的 self.view 的 translatesAutoresizingMaskIntoConstraints 设置为 NO(仅适用于您添加到其中的子视图)。
在 VFL 中,|表示超级视图,但是您的两个按钮(loginBtn、registerBtn)是按钮组的子视图。所以你应该定义关于 loginBtn、registerBtn 和 buttonGroup 的 V 关系。正如 rdelmar 所说,self.view 应该将 translatesAutoresizingMaskIntoConstraints 设置为 No。这可以关闭 autosizingmask 功能。我认为在 xib 或 storyboard 中做这件事的最好方法。
我在一个 UIView 中有两个按钮,然后我将视图添加到主视图,但我最终得到了这样的东西:
如您所见,这两个按钮超出了红色视图。
我想要顶部有一点边距,所以我使用 constraintsWithVisualFormat:@"V:|-100-[buttonGroup]-10-|"
,我不确定这是否重要。
原代码如下:
- (UIButton*) getButtonWithTitle: (NSString*) title
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.layer.borderColor = [UIColor blackColor].CGColor;
button.layer.borderWidth = 0.5f;
button.layer.cornerRadius = 2.0f;
[button setTranslatesAutoresizingMaskIntoConstraints:NO];
[button setTitle:title forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState: UIControlStateNormal];
return button;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
UIButton *loginBtn = [self getButtonWithTitle:@"Login"];
UIButton *registerBtn = [self getButtonWithTitle:@"Register"];
UIView *buttonGroup = [[UIView alloc] init];
[buttonGroup setTranslatesAutoresizingMaskIntoConstraints:NO];
[buttonGroup addSubview: loginBtn];
[buttonGroup addSubview: registerBtn];
[self.view addSubview: buttonGroup];
[buttonGroup setBackgroundColor:[UIColor redColor]];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(loginBtn, registerBtn, buttonGroup);
[buttonGroup addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[loginBtn]-20-[registerBtn(==loginBtn)]-|"
options:0
metrics:nil
views:viewsDictionary
]];
NSArray *verticalConstraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-100-[buttonGroup]-10-|"
options:0
metrics:nil
views:viewsDictionary];
NSArray *horizontalConstraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[buttonGroup]-|"
options:0
metrics:nil
views:viewsDictionary];
[self.view addConstraints: horizontalConstraints];
[self.view addConstraints: verticalConstraints];
}
编辑
我添加的约束:
[buttonGroup addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[loginBtn]-|"
options:0
metrics:nil
views:viewsDictionary
]];
[buttonGroup addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[registerBtn]-|"
options:0
metrics:nil
views:viewsDictionary
]];
看来我做了额外的工作...
您从未在按钮和按钮组之间创建任何垂直约束;添加那些,你应该很好。此外,您不应将控制器的 self.view 的 translatesAutoresizingMaskIntoConstraints 设置为 NO(仅适用于您添加到其中的子视图)。
在 VFL 中,|表示超级视图,但是您的两个按钮(loginBtn、registerBtn)是按钮组的子视图。所以你应该定义关于 loginBtn、registerBtn 和 buttonGroup 的 V 关系。正如 rdelmar 所说,self.view 应该将 translatesAutoresizingMaskIntoConstraints 设置为 No。这可以关闭 autosizingmask 功能。我认为在 xib 或 storyboard 中做这件事的最好方法。