1

メインのUIViewConrollerの左側にあるコンテナビューがあります。このコンテナビューは、下部にいくつかのボタン、中央にユーザーデータを表示するUITableView、上部に選択したユーザーデータを表示する別のUITableViewで構成されています。このトップUITableViewの動作で、選択したデータがない場合は非表示になり、データがある場合は最大高さ200に達するようにします。選択された各データ項目は、テーブルのエントリに相当します。

写真をチェックしてください。それが実行されている写真では、「テスト」というタイトルの選択されたデータ項目を1つロードしました。

ここに画像の説明を入力してください ここに画像の説明を入力してください

とにかく、私が抱えている問題は、InterfaceBuilderによって作成されたレイアウトの制約に関連しています。データテーブルと選択したデータテーブルのサイズを動的に変更するために行った手順は次のとおりです。

一番上のTableViewを<=200に設定し、真ん中のTableViewをデフォルトのままにして、次のコードを追加して一番上のテーブルのサイズを変更しました。

-(void)setSelectedFacets:(NSArray *)selectedFacets{
    _selectedFacets = selectedFacets;
    [self.selectedFacetsTableView reloadData];

    CGRect frame = self.selectedFacetsTableView.frame;
    frame.size.height = 10 ;//36 * selectedFacets.count;
    self.selectedFacetsTableView.frame = frame;
    [self.selectedFacetsTableView setNeedsDisplay];
    [self.view setNeedsDisplay];
}

上記の切り取られたコードは(View Controllerが完全にロードされた後に)実行されますが、実際の高さには影響しません。

誰かがこれを使った経験はありますか?

NSLayoutConstraintsにIBOutletを追加して(それらへの参照を取得するために)、実行時にそれらを削除できることを私は知っています。これは、本来よりも多くの作業のようです。私は何かが足りないのですか?

4

1 に答える 1

0

自動レイアウトを使用している場合は、フレームを設定しないでください。レイアウトの制約のみを追加/削除/変更します。

"Pin" や "Align" などのボタンを使用して、IB で NSLayoutConstraints のみを使用していることを確認してください。ソース コードでアクセス可能な tableView の高さの制約を作成します。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *tableViewHeightConstraint;

実際に高さを設定するスニペットはupdateViewContraints

- (void)updateViewConstraints {
    CGFloat height = MAX(200.0f, 36.0f * selectedFacets.count);
    [self.tableView removeConstraint:self.tableViewHeightConstraint];
    NSLayoutConstraint *lc = [NSLayoutConstraint constraintWithItem:self.tableView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:height];
    [self.tableView addConstraint:lc];
    self.tableViewHeightConstraint = lc;
    [super updateViewConstraints];
}

setSelectedFacets:通話だけで[self updateViewConstraints]

于 2013-08-27T08:18:29.263 に答える