2016-05-22 13 views
2

ViewControllerに2つのUIViewを追加しようとしています。それらの1つはプレーンなUIViewで、もう1つはUITableViewです。私は、UITableViewがそのコンテンツに必要な高さであり、他のビューがUITableViewの高さに基づいてサイズ変更できるような高さの制約を設定する方法についてはあまりよく分かりません。ViewController内の2つのビューで自動レイアウトの制約をプログラムで設定する

以下は、これらの制約を設定するために使用している簡単なスケッチとコードです。

enter image description here

NSDictionary *views = NSDictionaryOfVariableBindings(_infoView,_infoTableView); 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_infoView]" 
                    options:0 
                    metrics:nil 
                    views:views]]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_infoView]-[_infoTableView]" 
                    options:0 
                    metrics:nil 
                    views:views]]; 

// Width constraint 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoView 
               attribute:NSLayoutAttributeWidth 
               relatedBy:NSLayoutRelationEqual 
                toItem:self.view 
               attribute:NSLayoutAttributeWidth 
               multiplier:1.0 
                constant:0]]; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoTableView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                 attribute:NSLayoutAttributeWidth 
                multiplier:1.0 
                 constant:0]]; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoView 
                 attribute:NSLayoutAttributeTop 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                 attribute:NSLayoutAttributeTop 
                multiplier:1.0 
                 constant:0]]; 

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

すべてのコメント/フィードバックが高く評価されるだろう。おかげさまで

+0

あなたは彼らが見てみたい正確にどのように私たちを表示するスケッチやSTHを描くことはできますか? – ozgur

+0

ozgur - スケッチを追加しました。 – slonkar

答えて

2

あなたは正しい方向にあります。

まずあなたが高さ制約を保持するプロパティを定義します:ここでのトリックはそうinfoViewは、それが縦に拡大すべきであるのいずれかまたは収縮知っているあなたが動的にcontentSize.heighttableViewの高さを更新する必要があるということです

@property (nonatomic, strong) NSLayoutConstraint *tableViewHeightConstraint; 

- (void)viewDidLoad { 
    ... 
    self.tableViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self.tableView 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:nil 
                   attribute:NSLayoutAttributeNotAnAttribute 
                   multiplier:0.0 
                   constant:350.0]; 
} 

次に、あなたのtableViewはそのcontentSize (例:viewDidAppear:animated)を知っている右後の高さの制約を更新することができ

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    self.tableViewHeightConstraint.constant = self.tableView.contentSize.height; 
    [self.view layoutIfNeeded]; 
} 

私はあなたのためにa sample projectを作成しました。私はあなたが何をしようとしているのかをより良く理解するために遊んでいます。

enter image description here

+0

説明とサンプルアプリをありがとうございました。私の問題は、提案したように新しいheightConstraintを追加することによって解決されました。あなたのサンプルコードを見ている間、私はあなたが幅制約/トップボトム制約を使用していないことにも気付きました。具体的な理由はありますか?それらの最小限の制約に私のコードを変更したとき、私の両方のビューは消えたので。 – slonkar

+1

'V:| [infoView] - [tableView] |'のような垂直方向の制約を定義するとき、 '|'に注目してください。これは、サブビューがスーパービューの上部と下部に制限されることを保証します。 'H:| [infoView] |'などの水平制約にも同じことが適用され、infoViewの先頭と末尾は制約されているため、幅の制約を設定する必要はありません。 – ozgur

+0

ああ、私はそれを逃した。ありがとう!!! – slonkar

関連する問題