繁体   English   中英

子视图约束以编程方式

[英]Subview constraints programmatically

我想以编程方式对电子邮件字段进行约束。 但是它不起作用。

图像描述:有一个TopView。 在此,白色框是TopInnerView 最后,如果我添加EmailTextFieldTopInnerView 显示错误。

这是我的代码:

//MainView
    MainView = [[UIView alloc]initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.height)];
    MainView.backgroundColor = [UIColor whiteColor];
    [MainView setTranslatesAutoresizingMaskIntoConstraints:NO];
     [self.view addSubview:MainView];

//TopView
TopView = [[UIView alloc]init];
TopView.backgroundColor = [UIColor groupTableViewBackgroundColor];
[MainView addSubview:TopView];
[TopView setTranslatesAutoresizingMaskIntoConstraints:NO];

//TopInnerView
TopInnerView = [[UIView alloc]init];
TopInnerView.backgroundColor = [UIColor redColor];
[TopView addSubview:TopInnerView];
[TopInnerView setTranslatesAutoresizingMaskIntoConstraints:NO];

//EmailTextField
EmailTextField = [[UITextField alloc]init];
//WithFrame:CGRectMake(10, 0, 270, 40)];
EmailTextField.borderStyle = UITextBorderStyleRoundedRect;
[TopInnerView addSubview:EmailTextField];
id views = @{
                     @"TopView": TopView,
                     @"TopInnerView": TopInnerView,
                     @"CenterView":CenterView,
                     @"BottomView": BottomView,
                     @"EmailTextField":EmailTextField
                     };

// TopView constraints
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[TopView(320)]" options:0 metrics:nil views:views]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:110]];
//[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
NSLayoutConstraint *TopViewHeightConstraint = [NSLayoutConstraint constraintWithItem:TopView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:170.0];
[self.view addConstraint:TopViewHeightConstraint];


// TopInnerView constraints
[TopView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[TopInnerView]-20-|" options:0 metrics:nil views:views]];
[TopView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[TopInnerView(80)]" options:0 metrics:nil views:views]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:TopInnerView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:TopView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]];
[TopView addConstraint:[NSLayoutConstraint constraintWithItem:TopInnerView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:TopView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
//[TopView addConstraint:[NSLayoutConstraint constraintWithItem:TopInnerView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:TopView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];

//EmailTextField Constriants
//[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[EmailTextField(270)]" options:0 metrics:nil views:views]];
//Leading Constriant
NSLayoutConstraint *Leading = [NSLayoutConstraint
                                constraintWithItem:EmailTextField
                                attribute:NSLayoutAttributeTrailing
                                relatedBy:NSLayoutRelationEqual
                                toItem:self.view
                                attribute:NSLayoutAttributeTrailing
                                multiplier:1.0
                                constant:10.0];

//Trailing Constriant
    NSLayoutConstraint *Trailing = [NSLayoutConstraint
                                   constraintWithItem:EmailTextField
                                   attribute:NSLayoutAttributeTrailing
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:self.view
                                   attribute:NSLayoutAttributeTrailing
                                   multiplier:1.0
                                   constant:0.0];

    [self.view addConstraint:Leading];
    [self.view addConstraint:Trailing];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:EmailTextField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:TopInnerView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]];
NSLayoutConstraint *EmailTextFieldHeightConstraint = [NSLayoutConstraint constraintWithItem:EmailTextField attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:40.0];
[self.view addConstraint:EmailTextFieldHeightConstraint];

可以肯定的是,程序约束可能是一件微妙的事情,它们会使您发疯。 话虽这么说,但我看到这里发生的一些事情会使我感到紧张,如果这是我的设计。

首先,您要创建每个视图,并将每个视图作为子视图添加到刚创建的视图中(这不一定是错误的)。 然后,你到它相应的亲本视图-除了与有关每个视图约束EmailTextField你在哪里与前两个约束self.view

接下来,您的Leading约束将使用NSLayoutAttributeTrailing属性; NSLayoutAttributeLeading这是一个错字,应该是NSLayoutAttributeLeading 没有看到您的错误,我不能确定,但​​是我EmailTextView ,您需要将EmailTextView前两个关系更改为如下所示:

//EmailTextView
[TopInnerView addSubview:EmailTextField];
NSLayoutConstraint *Leading = [NSLayoutConstraint
                                constraintWithItem:EmailTextField
                                attribute:NSLayoutAttributeLeading
                                relatedBy:NSLayoutRelationEqual
                                toItem:TopInnerView
                                attribute:NSLayoutAttributeTrailing
                                multiplier:1.0
                                constant:10.0];

//Trailing Constraint
    NSLayoutConstraint *Trailing = [NSLayoutConstraint
                                   constraintWithItem:EmailTextField
                                   attribute:NSLayoutAttributeTrailing
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:TopInnerView
                                   attribute:NSLayoutAttributeTrailing
                                   multiplier:1.0
                                   constant:0.0];

然后将这两个都作为约束添加到self.view ,考虑到如何定义这些约束,这将是一致的。 但是,你终于定义之间的两个约束EmailTextFieldInnerTopView和添加这些约束self.view这是不符合你如何做之前保持一致。 使用您现有的设计,我会尝试这样做:

[TopInnerView addConstraint:Leading];
[TopInnerView addConstraint:Trailing];

您的最后两个约束可以从接受相同的一致性处理中受益; 我将把它留给您作为练习。

总的来说,我敢打赌,UI可能只是在所有嵌入式约束上都令人窒息。 如果这些调整无济于事,我建议您将代码返回到第一次定义EmailTextField对象的位置。 然后一个接一个地处理每个约束,以确保您一致地定义每个约束。 最后,将每个对象一次添加到UI层次结构中,以确保您在该方法中也保持一致。 最终,您将找到导致问题的约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM