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 に更新し、インターフェイス ビルダーとストーリーボードを使用しますが、ここ 1 年は iOS プログラミングを行っていません。

新しい iPhone 5 では画面サイズが異なるため、アプリの見栄えが悪く、何らかの自動レイアウトを実装する必要があります。IBを使用する代わりに、今のところプログラムでそれを行う方法はありますか?

どうもありがとう!

4

2 に答える 2

31

はい、あります。NSLayoutConstraint で 2 つのメソッドを使用することによって

-(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)]];

パイプ記号「|」スーパービューのエッジを表します。[] はビューを表します。そこで、iouTableView の左端と右端をそのスーパービューの左端と右端にフックしました。

ビジュアル フォーマットのもう 1 つの例: テーブル ビュー、サマリー ラベル、サマリー テーブルを垂直にフックしてみましょう。

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

これで、3 つのビューすべてがそれぞれの端で垂直にリンクされます。NSLayoutFormatAlignAllLeft は、すべてのビューに左揃えを指示し、他の制約 (この場合は前の制約) に基づいてそうします。() は、ビューのサイズを指定するために使用されます。

「-」スペーサー記号だけでなく、不等式と優先順位のようなものもありますが、それについてはアップルのドキュメントを確認してください

編集:メソッドの署名に示されているように、constraintWithVisualFormat を使用するように例を修正しました。

于 2012-09-27T13:52:01.193 に答える
1

Aplle が提供するメソッドに加えて、コードから AutoLayout を操作するためにParus lib を使用できます。

たとえば、次のように指定できます。

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 に答える