web-dev-qa-db-ja.com

UITableViewの高さを、コンテンツの合計サイズのみに収まるようにサイズ変更します。

だから私は非常に基本的な問題を抱えています。このUITableViewview内にあり、このテーブルの高さを、テーブル内のすべての行を表示するために必要な高さにしたいと思います。したがって、スクロールできないようにしたいのですが、すべての行を表示したいだけです。 (行の量とheightは動的です)。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping];
    return cellSize.height;
}

20行ある場合、テーブルは非常に高くなりますが、1行しかない場合、テーブルは非常に小さくなり、他のコンテンツは19行下に表示されません。

16
abisson

私が正しく理解していれば、各行の高さを合計し、それに基づいてテーブルビューの高さを調整できるはずです。

CGFloat tableHeight = 0.0f;
for (int i = 0; i < [_stepsArray count]; i ++) {
    tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
}
self.tableView.frame = CGRectMake(self.tableView.frame.Origin.x, self.tableView.frame.Origin.y, self.tableView.frame.size.width, tableHeight);

[tableViewreloadData]の直後にこれを行うことができます

23
Edwin Iskandar

より簡単な解決策は次のとおりです。必要なのは、セルが入力された後、sizeToFitUITableViewを設定することだけです。 delegateおよびdataSourceからxibを設定する場合、次のようにviewDidLoadメソッドまたはviewDidAppearでこれを行うことができます。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [yourTableView sizeToFit];
}

ただし、コードのどこかにdelegatedataSourceを追加する場合は、この後にsizeToFitを追加する必要があります。

- (void)someMethod
{
    [yourTableView setDelegate:self];
    [yourTableView setDataSource:self];

    [yourTableView sizeToFit];
}

また、どこかで行う場合は、reloadTableの後にこれを行う必要があります。

これにより、テーブルのサイズがセルの高さの合計である高さに正確に変更されます。

7
akelec

あなたはこのように試すことができます、

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        NSLog(@"%f",your_tableView.contentSize.height);
    }
}

Swift 3.

func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row {
        print("\(tableView.contentSize.height)")
    }
}
4
Venk

テーブルに高さの制約を設定し、コンセントに接続して、ViewControllerに以下を追加します。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tableViewHeightContraint.constant = tableView.contentSize.height
}
3
phatmann

テーブルビューのcontentSizeプロパティのオブザーバーを追加し、それに応じてフレームサイズを調整します

ViewDidLoadに次のコード行を追加します

[your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];

次に、コールバックで:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
         CGRect frame = your_tableview.frame;
         frame.size = your_tableview.contentSize;
         your_tableview.frame = frame;
    }

これがお役に立てば幸いです。

3
Anooj VM

tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];を使用するだけで問題が解決します。

0
Chauyan