だから私は非常に基本的な問題を抱えています。このUITableView
はview
内にあり、このテーブルの高さを、テーブル内のすべての行を表示するために必要な高さにしたいと思います。したがって、スクロールできないようにしたいのですが、すべての行を表示したいだけです。 (行の量と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行下に表示されません。
私が正しく理解していれば、各行の高さを合計し、それに基づいてテーブルビューの高さを調整できるはずです。
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]の直後にこれを行うことができます
より簡単な解決策は次のとおりです。必要なのは、セルが入力された後、sizeToFit
にUITableView
を設定することだけです。 delegate
およびdataSource
からxib
を設定する場合、次のようにviewDidLoad
メソッドまたはviewDidAppear
でこれを行うことができます。
- (void)viewDidLoad
{
[super viewDidLoad];
[yourTableView sizeToFit];
}
ただし、コードのどこかにdelegate
とdataSource
を追加する場合は、この後にsizeToFit
を追加する必要があります。
- (void)someMethod
{
[yourTableView setDelegate:self];
[yourTableView setDataSource:self];
[yourTableView sizeToFit];
}
また、どこかで行う場合は、reloadTableの後にこれを行う必要があります。
これにより、テーブルのサイズがセルの高さの合計である高さに正確に変更されます。
あなたはこのように試すことができます、
-(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)")
}
}
テーブルに高さの制約を設定し、コンセントに接続して、ViewControllerに以下を追加します。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableViewHeightContraint.constant = tableView.contentSize.height
}
テーブルビューの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;
}
これがお役に立てば幸いです。
tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
を使用するだけで問題が解決します。