web-dev-qa-db-ja.com

自動レイアウト機能でUITableViewの高さを動的にする方法は?

Xcode 5で自動レイアウトを使用しています。

テーブルビューの高さを200px以上に設定します。動的なサイズが必要です。多くの行がある場合もあれば、数行ある場合もあるためです。

ただし、サイズは常に200pxです。また、コンテンツがそれよりも大きい場合は、下にスクロールして下の行を表示する必要があります。

テーブルビューに動的なサイズを与えるにはどうすればよいですか?enter image description here

35
Burak

これは、Xcodeの最新バージョンでテストされています。

1)Xcodeでストーリーボードに移動し、テーブルビューをクリックして選択します。

2)[ユーティリティ]ペイン(写真1を参照)で、テーブルビューの高さの制約が定義されていることを確認します。

Table view heigth constraint

3)テーブルビューを表示するView Controllerで、この制約へのアウトレットを作成します。

In Swift 3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

Objective Cで

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;

4)ストーリーボードでUITableViewの高さの制約に戻り、右側のアイコンの色が紫から青に変わったことを確認します(図2を参照)

Table view heigth constraint after outlet

4)また、同じView Controllerにこのコードを配置します。

Swift

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = min(self.view.bounds.size.height, tableView.contentSize.height)
    dynamicTVHeight.constant = height
    self.view.layoutIfNeeded()
}

客観的C

- (void)viewWillAppear:(BOOL)animated
{
    // just add this line to the end of this method or create it if it does not exist
    [self.tableView reloadData]; 
}

-(void)viewDidLayoutSubviews
{
    CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height);
    self.dynamicTVHeight.constant = height;
    [self.view layoutIfNeeded];
}

これで問題が解決するはずです。

これらは、目的の処理を行うサンプルプロジェクトの2つのバージョンへのリンクです。1つはObjective C用で、もう1つはSwift 3.ダウンロードしてXcodeでテストします。 Xcodeの最新バージョン、Xcode 8.3.2。

https://github.com/jcatalan007/TestTableviewAutolayouthttps://github.com/jcatalan007/TestTableviewAutolayoutSwift

65
Juan Catalan

xibまたはストーリーボードでセルを作成します。アウトレットのコンテンツを提供します。 CellForRowAtIndexPathで呼び出します。例えば。コメントのラベルテキストに従ってセルの高さを設定する場合。enter image description here

コメントを設定しますLbl.numberOfLine = 0;

その後、ViewDidLoadで

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;

そしていま

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}

出来上がり............あなたはそれをやった....

4
Mohit tomar

Ctrlキーを押しながらUITableViewの高さ制約をView Controllerのソースコードにドラッグして、名前を付けることができます。次に、ViewControllerのupdateViewConstraintsで、その制約の定数をtableView.contentSize.heightに設定できます。

....

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

....

override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}
2

プログラムで実行できます。概念(およびコード自体)は実際には非常に単純です。

MyTableViewのスーパービューのupdateConstraintsメソッドで、myTableViewの高さがmyTableView.contentSize.heightと等しくなるように制約を追加します。

IOS 7をターゲットとするXcode 6でテスト済み。

2
Donald