9

我有一个应用程序,其视图是以编程方式生成的。例子:

-(void)loadView
{
    [super loadView];

// SET TOP LEFT BTN FOR NEXT VIEW
UIBarButtonItem *topLeftBtn = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = topLeftBtn;
[topLeftBtn release];

// programmatically set up the view for cart tableView
CGRect iouTableViewFrame = CGRectMake(0, 0, 320, 348);
iouTableView = [[UITableView alloc]initWithFrame:iouTableViewFrame style:UITableViewStylePlain];
[[self iouTableView] setDelegate:self];
[[self iouTableView] setDataSource:self];
[[self view] addSubview:iouTableView];

// set up the summary label
CGRect summaryTableFrame = CGRectMake(0, 348, 320, 18);
UILabel *summaryTableLabel = [[UILabel alloc] initWithFrame:summaryTableFrame];
[summaryTableLabel setFont:[UIFont fontWithName:@"Helvetica" size:14]];
[summaryTableLabel setText:@"   Summary"];
UIColor *labelColor = UIColorFromRGB(MiddleBlueColor);
[summaryTableLabel setBackgroundColor:labelColor];
[summaryTableLabel setTextColor:[UIColor whiteColor]];
[[self view] addSubview:summaryTableLabel];

// set up the summary table
CGRect summaryTableViewFrame = CGRectMake(0, 366, 320, 44);
summaryTableView = [[UITableView alloc]initWithFrame:summaryTableViewFrame style:UITableViewStylePlain];
[summaryTableView setScrollEnabled:NO];
[[self summaryTableView] setDelegate:self];
[[self summaryTableView] setDataSource:self];
[[self view] addSubview:summaryTableView];
}

是的。将来我会更新到 NIB 并使用界面构建器和故事板,但我已经一年没有做过 ios 编程了。

随着新 iPhone 5 的屏幕尺寸不同,应用程序看起来不太好,我需要实现某种自动布局。现在有没有办法以编程方式而不是使用 IB?

非常感谢!

4

2 回答 2

31

是的,通过在 NSLayoutConstraint 中使用两种方法

-(NSArray*)constraintsWithVisualFormat:options:metrics:views:
-(NSLayoutConstraint*)constraintWithItem:attribute:relatedBy:toItem:attribute:
    multiplier:constant:

视觉格式语言全部打包成一个 NSString 所以我会拿你的 iouTableView 为例。

[self.view addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"|[iouTableView]|" 
    options:0 
    metrics:nil 
    views:NSDictionaryOfVariableBindings(iouTableView)]];

管道符号“|” 代表superview的边缘。[] 代表一个视图。所以我们在那里所做的就是将 iouTableView 的左右边缘连接到其父视图的左右边缘。

另一个视觉格式的例子:让我们垂直挂钩你的表格视图、汇总标签和汇总表。

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
    @"V:|[iouTableView(348)][summaryTableLabel(18)][summaryTableView(44)]"
    options:NSLayoutFormatAlignAllLeft
    metrics:nil
    views:NSDictionaryOfVariableBindings(iouTableView, summaryTableLabel, summaryTableView)]];

现在这将所有三个视图在它们的每个边缘上垂直连接起来,NSLayoutFormatAlignAllLeft 告诉所有视图左对齐,它们将根据其他约束(在本例中为前一个约束)这样做。()s 用于指定视图的大小。

有点像不等式和优先级以及“-”间隔符号,但请查看苹果文档

编辑:更正示例以使用 constraintsWithVisualFormat,如方法签名中所示。

于 2012-09-27T13:52:01.193 回答
1

除了 Aplle 提供的方法之外,您还可以使用Parus lib 从代码中使用 AutoLayout 进行操作。

例如,您将能够指定:

PVVFL(@"[view1]-20-[view2]").fromRightToLeft.withViews(views).asArray

代替

[NSLayoutConstraint constraintsWithVisualFormat:@"[view1]-20-[view2]"
                                        options:NSLayoutFormatDirectionRightToLeft
                                        metrics:nil
                                          views:views]

您还可以对布局设置进行分组,混合 VFL 而不是 VFL 约束。 Parus能够防止常见错误,区分位置参数约束,并提供出色的自动完成支持。

于 2013-08-21T16:22:20.007 回答