为什么使用Autolayout / Constraints而不是frame和layoutSubviews?

时间:2015-07-31 22:01:17

标签: ios autolayout frame

我已经为我的应用启动屏幕实现了一个视图控制器,如下所示。我决定使用框架而不是自动布局,我想知道是否有任何理由在这里使用自动布局/约束。

我不允许在我的应用上轮播,所以我不知道我会从约束中获得什么好处,因为我不想使用界面构建器,我认为代码是更清洁/更容易创建和布置框架。

我感谢任何输入 - 请找到下面的代码。

#import "LaunchViewController.h"
#import "RegisterTableViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface LaunchViewController ()

@property (nonatomic) UILabel *appLabel;
@property (nonatomic) UIButton *signUpButton;
@property (nonatomic) UIButton *loginButton;

@end

@implementation LaunchViewController

#pragma mark - UIViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor standardBlackColor];
    [self layoutViews];
}

- (void)viewDidAppear {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - UIView

- (void)layoutViews
{
    self.appLabel.frame = [self _appLabelFrame];
    self.loginButton.frame = [self _loginButtonFrame];
    self.signUpButton.frame = [self _signUpButtonFrame];

    [self.view addSubview:self.appLabel];
    [self.view addSubview:self.loginButton];
    [self.view addSubview:self.signUpButton];
}

#pragma mark - Layout

- (CGRect)_appLabelFrame
{
    CGFloat x_offset = 0;
    CGFloat y_offset = (self.view.frame.size.height / 10);
    CGFloat width =self.view.frame.size.width;
    CGFloat height = 50;
    return CGRectMake(x_offset, y_offset, width, height);
}

- (CGRect)_signUpButtonFrame
{
    CGFloat height = self.view.frame.size.height/14;
    CGFloat x_offset = self.view.frame.size.width / 24;
    CGFloat y_offset = self.view.frame.size.height - ((height + x_offset));
    CGFloat width = self.view.frame.size.width - (2 * x_offset);
    return CGRectMake(x_offset, y_offset, width, height);}

- (CGRect)_loginButtonFrame
{
    CGFloat height = self.view.frame.size.height/14;
    CGFloat x_offset = self.view.frame.size.width / 24;
    CGFloat y_offset = self.view.frame.size.height - ((2 * height)+(2 * x_offset));
    CGFloat width = self.view.frame.size.width - (2 * x_offset);
    return CGRectMake(x_offset, y_offset, width, height);
}

#pragma mark - Getters and Setters

- (UILabel *)appLabel
{
    if (!_appLabel){
        _appLabel = [[UILabel alloc] init];
        _appLabel.text = @"iOS APP";
        _appLabel.textAlignment = NSTextAlignmentCenter;
        [_appLabel setFont:[UIFont appThinTitleFont]];
        _appLabel.textColor = [UIColor whiteColor];
    }
    return _appLabel;
}

- (UIButton *)signUpButton
{
    if (!_signUpButton){
        _signUpButton = [[UIButton alloc] init];
        _signUpButton.backgroundColor = [UIColor darkBlueColor];
        [_signUpButton setTitle:@"SIGN UP" forState:UIControlStateNormal];
        [_signUpButton.titleLabel setFont:[UIFont largeRegularButtonFont]];
        [_signUpButton addTarget:self action:@selector(signupPageSegue) forControlEvents:UIControlEventTouchUpInside];
    }
    return _signUpButton;
}

- (UIButton *)loginButton
{
    if (!_loginButton){
        _loginButton = [[UIButton alloc] init];
        _loginButton.backgroundColor = [UIColor clearColor];
        _loginButton.layer.borderColor = [[UIColor whiteColor] CGColor];
        _loginButton.layer.borderWidth =1.0f;
        [_loginButton setTitle:@"LOGIN" forState:UIControlStateNormal];
        [_loginButton.titleLabel setFont:[UIFont largeRegularButtonFont]];
        [_loginButton addTarget:self action:@selector(loginPageSegue) forControlEvents:UIControlEventTouchUpInside];
    }
    return _loginButton;
}

#pragma mark - Targets

- (void)signupPageSegue
{
    [self performSegueWithIdentifier:@"SignUpSegue" sender:self];
}

- (void)loginPageSegue
{
    [self performSegueWithIdentifier:@"LoginSegue" sender:self];
}

@end

enter image description here

3 个答案:

答案 0 :(得分:5)

花一些时间学习自动布局。你会很高兴的。

您所展示的布局可以在Interface Builder中更加简单地表达,更重要的是,随着新要求的出现,它将更容易更新。

虽然这个特定的屏幕确实可行,但确实如此。随着您的应用程序的增长,您将很快学会在代码中表达所有内容时过于劳力密集。

另请注意,如果您想在iPad上运行此应用程序,该应用程序将无法支持多任务处理。

答案 1 :(得分:3)

开始一个新项目需要3分钟,并在故事板中使用自动布局构建此屏幕。

enter image description here

答案 2 :(得分:2)

你应该使用约束因为:

1)他们只是&#34;帧&#34;

2)你会遇到不同屏幕分辨率4s / 5s,5,5c /的问题 如果你没有使用autolayout你的应用程序自动增加屏幕(6/6 +)和一些exp的人。会被注意到这个错误,因为它真的是错误而且专业人士不这样做。

3)您的代码将减少两次。

4)你说&#34;我不想使用界面构建器&#34;那是什么?喜欢/不喜欢?你应该使用UIKit的所有功能,你不能按你的意愿去做,你应该有效地工作......你应该使用IB +约束......

请花时间学习如何使用约束,这真的不难。