如何以编程方式使用约束?

时间:2016-03-31 07:00:40

标签: ios objective-c autolayout constraints

我正在开发应用程序,它只能水平工作并以编程方式执行所有操作。

我有一个imageview,两个文本字段和两个按钮,但我不知道如何设置这些文本字段和按钮的约束,意味着当我在iPhone 5s中使用时,它很好,但当我使用iPhone 6s plus那看起来很小。 我在这里发布了一些代码和截图

UIImageView *logoImage = [[UIImageView alloc]init];
    logoImage.frame = CGRectMake(CGRectGetMidX(self.view.frame)-100, 10, 250, 100);
    [logoImage setImage:[UIImage imageNamed:@"antya_logo1.png"]];

    [self.view addSubview:logoImage];

    UILabel *loginLabel = [[UILabel alloc]init];
    loginLabel.frame = CGRectMake(10, 0, 100, 40);
    loginLabel.text = @"Login Form";
    loginLabel.textColor = [UIColor blackColor];
    loginLabel.font = [UIFont fontWithName:@"LaoSangamMN" size:18];


    CGFloat Xuser = CGRectGetMidX(self.view.frame)-120;
    CGFloat Yuser = CGRectGetMaxY(loginLabel.frame)+80;

    usernameField = [[UITextField alloc]init];
    usernameField.frame = CGRectMake(Xuser, Yuser, 300, 35);
    usernameField.placeholder = @"  User Name";
    usernameField.font = [UIFont fontWithName:@"LaoSangamMN" size:18];
    usernameField.backgroundColor = [UIColor whiteColor];
    usernameField.layer.cornerRadius = 7;
    usernameField.layer.borderWidth = 0.5;

    [self.view addSubview:usernameField];

    UIImageView *userImgV = [[UIImageView alloc]init];
    userImgV.frame = CGRectMake(CGRectGetMinX(usernameField.frame)-35, CGRectGetMinY(usernameField.frame)+5, 25, 25);
    [userImgV setImage:[UIImage imageNamed:@"user-icon.png"]];

    [self.view addSubview:userImgV];

    CGFloat Ypass = CGRectGetMaxY(usernameField.frame)+20;

    passwordField = [[UITextField alloc]init];
    passwordField.frame = CGRectMake(Xuser, Ypass, 300, 35);
    passwordField.placeholder = @"  Password";
    passwordField.secureTextEntry = YES;
    passwordField.font = [UIFont fontWithName:@"LaoSangamMN" size:18];
    passwordField.backgroundColor = [UIColor whiteColor];
    passwordField.layer.cornerRadius = 7;
    passwordField.layer.borderWidth = 0.5;


    [self.view addSubview:passwordField];

这是我的手机6s plus enter image description here

这是在i phone5s

enter image description here

请提前帮助我

2 个答案:

答案 0 :(得分:1)

注意:当你处理autolayout时,设置框架的视图不起作用。您需要为该视图设置约束,以便在所有iPhone设备中正确显示。

UIImageView *logoImage = [[UIImageView alloc] init];
[logoImage setImage:[UIImage imageNamed:@"antya_logo1.png"]];
logoImage.translatesAutoresizingMaskIntoConstraints = false;

[self.view addSubview:logoImage];

UILabel *loginLabel = [[UILabel alloc]init];
loginLabel.text = @"Login Form";
loginLabel.textColor = [UIColor blackColor];
loginLabel.font = [UIFont fontWithName:@"LaoSangamMN" size:18];
loginLabel.translatesAutoresizingMaskIntoConstraints = false;

[self.view addSubview:loginLabel];

UITextField *usernameField = [[UITextField alloc]init];
usernameField.placeholder = @"  User Name";
usernameField.font = [UIFont fontWithName:@"LaoSangamMN" size:18];
usernameField.backgroundColor = [UIColor whiteColor];
usernameField.layer.cornerRadius = 7;
usernameField.layer.borderWidth = 0.5;
usernameField.translatesAutoresizingMaskIntoConstraints = false;

UIImageView *userImgV = [[UIImageView alloc]init];
[userImgV setImage:[UIImage imageNamed:@"user-icon.png"]];

//set left view of textfield
usernameField.leftView = userImgV;
usernameField.leftViewMode = UITextFieldViewModeAlways;
[self.view addSubview:usernameField];


UITextField *passwordField = [[UITextField alloc]init];
passwordField.placeholder = @"  Password";
passwordField.secureTextEntry = YES;
passwordField.font = [UIFont fontWithName:@"LaoSangamMN" size:18];
passwordField.backgroundColor = [UIColor whiteColor];
passwordField.layer.cornerRadius = 7;
passwordField.layer.borderWidth = 0.5;
passwordField.translatesAutoresizingMaskIntoConstraints = false;

//set left view of textfield

UIImageView *passwordImgV = [[UIImageView alloc]init];
[passwordImgV setImage:[UIImage imageNamed:@"password-icon.png"]];

passwordField.leftView = passwordImgV;
passwordField.leftViewMode = UITextFieldViewModeAlways;
[self.view addSubview:passwordField];


UIButton *buttonSignUp = [UIButton buttonWithType:UIButtonTypeCustom];
[buttonSignUp setTag:101];
[buttonSignUp setTitle:@"SIGNUP" forState:UIControlStateNormal];
[buttonSignUp addTarget:self action:@selector(<your selector>) forControlEvents:UIControlEventTouchUpInside];
buttonSignUp.translatesAutoresizingMaskIntoConstraints = false;
[self.view addSubview:buttonSignUp];

UIButton *buttonFP = [UIButton buttonWithType:UIButtonTypeCustom];
[buttonFP setTag:101];
[buttonFP setTitle:@"SIGNUP" forState:UIControlStateNormal];
[buttonFP addTarget:self action:@selector(<your selector>) forControlEvents:UIControlEventTouchUpInside];
buttonFP.translatesAutoresizingMaskIntoConstraints = false;
[self.view addSubview:buttonFP];

//setting constraints

//logoImage
//leading
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:logoImage attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10]];

//Top
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:logoImage attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:10]];

//traling
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:logoImage attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:10]];


// usernameField
//leading
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:usernameField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10]];

//traling
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:usernameField attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:10]];

//top
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:logoImage attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:usernameField attribute:NSLayoutAttributeTop multiplier:1.0 constant:10]];

//passwordField
//leading
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:passwordField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10]];

//traling
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:passwordField attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:10]];

//top
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:passwordField attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:passwordField attribute:NSLayoutAttributeTop multiplier:1.0 constant:10]];


//buttonSignUp and buttonFP

//leading for buttonSignUp
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:buttonSignUp attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10]];

//traling for buttonFP
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:buttonFP attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:10]];

//equal width for both
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:buttonFP attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:buttonSignUp attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]];

//space between both btns
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:buttonFP attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:buttonSignUp attribute:NSLayoutAttributeRight multiplier:1.0 constant:10]];

//top for both
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:buttonSignUp attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:passwordField attribute:NSLayoutAttributeTop multiplier:1.0 constant:10]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:buttonFP attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:passwordField attribute:NSLayoutAttributeTop multiplier:1.0 constant:10]];

//bottom
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:buttonFP attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:buttonSignUp attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10]];

答案 1 :(得分:0)

在ViewController上添加每个项目的@IBOutlet之后。您可以使用自动布局可视格式语言来实现编程约束。这是我的项目中要了解的示例代码。

Swift版本)如果您可以在 viewDidLoad 中使用单元格 awakeFromNib 或页面:

    avaImg.translatesAutoresizingMaskIntoConstraints = false
    usernameBtn.translatesAutoresizingMaskIntoConstraints = false
    infoLbl.translatesAutoresizingMaskIntoConstraints = false
    dateLbl.translatesAutoresizingMaskIntoConstraints = false

    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
        "H:|-10-[ava(30)]-10-[username]-7-[info]-10-[date]",
        options: [], metrics: nil, views: ["ava":avaImg, "username":usernameBtn, "info":infoLbl, "date":dateLbl]))

    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-10-[ava(30)]-10-|",
        options: [], metrics: nil, views: ["ava":avaImg]))

    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-10-[username(30)]",
        options: [], metrics: nil, views: ["username":usernameBtn]))

    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-10-[info(30)]"
        , options: [], metrics: nil, views: ["info":infoLbl]))

    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-10-[date(30)]",
        options: [], metrics: nil, views: ["date":dateLbl]))

Using Autolayout Visual Format with Swift?之前引用的其他链接

Objective-C Version )您可以找到许多详细信息here