web-dev-qa-db-ja.com

UITableViewのコンテンツを垂直方向に整列(中央揃え)する方法は?

ストーリーボードで作成されたUITableViewheaderView、およびfooterViewsを含むUITableViewCellのコンテンツを中央に配置します。どうすればこれを達成できますか?

これが私の問題を解決するために実装しようとしているものですが、これは機能しません。

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

    CGFloat height = self.tableView.frameHeight - self.navigationController.navigationBar.frameHeight - [UIApplication sharedApplication].statusBarFrame.size.height - (self.rowCount * self.rowHeight);
    self.tableView.tableHeaderView.frameHeight = height / 2.0;
}

したがって、navigationBarとstatusBarの高さ、およびセルの高さをtableViewの高さから引いて、空の領域の高さを取得しました。空の領域の高さを取得したので、フッターとヘッダーのビュー用に2に分割しました。

13
Xchord

viewWillAppearおよびdidRotateFromInterfaceOrientation関数で:

CGFloat headerHeight = (self.view.frame.size.height - (ROW_HEIGHT * [self.tableView numberOfRowsInSection:0]))) / 2;

self.tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0);

これはあなたの問題を解決します。

[〜#〜]編集[〜#〜]

viewWillLayoutSubviewsで、各reloadDataの後にpdateTableViewContentInset関数を呼び出します。

形容詞-C

- (void)updateTableViewContentInset {
    CGFloat viewHeight = self.view.frame.size.height;
    CGFloat tableViewContentHeight = self.tableView.contentSize.height;
    CGFloat marginHeight = (viewHeight - tableViewContentHeight) / 2.0;

    self.tableView.contentInset = UIEdgeInsetsMake(marginHeight, 0, -marginHeight, 0);
}

Swift 4

func updateTableViewContentInset() {
    let viewHeight: CGFloat = view.frame.size.height
    let tableViewContentHeight: CGFloat = tableView.contentSize.height
    let marginHeight: CGFloat = (viewHeight - tableViewContentHeight) / 2.0

    self.tableView.contentInset = UIEdgeInsets(top: marginHeight, left: 0, bottom:  -marginHeight, right: 0)
}
29
Pipiks

viewDidLayoutSubviewsをオーバーライドし、tableViewのframecontentSizeを比較して、contentInsetを設定します。 Swift 4:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let tableViewHeight = self.tableView.frame.height
    let contentHeight = self.tableView.contentSize.height

    let centeringInset = (tableViewHeight - contentHeight) / 2.0
    let topInset = max(centeringInset, 0.0)

    self.tableView.contentInset = UIEdgeInsets(top: topInset, left: 0.0, bottom: 0.0, right: 0.0)
}

これはセルフサイジングのテーブルビューセルでうまく機能します????

9
Axel Guilmin

Pipiksの回答に基づくSwift 3

let headerHeight: CGFloat = (view.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, -headerHeight, 0)
2
GregP

contentSizeUITableViewプロパティを使用すると、セルheightまたはcountを考慮する必要がなくなります。

- (void) updateTableInsetsForHeight: (CGFloat) height
{
    CGFloat tableViewInset = MAX((height - self.tableView.contentSize.height) / 2.0, 0.f);
    self.tableView.contentInset = UIEdgeInsetsMake(tableViewInset, 0, -tableViewInset, 0);
}

contentInsets- dataを再ロードした後、およびtableViewを含むビューが表示されたときにtableViewを更新します(viewWillAppear:)、サイズが変わったとき(viewWillTransitionToSize:withTransitionCoordinator:)。

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [self updateTableInsetsForHeight: size.height];
}
2
Aerows

Swift 3の場合:

var headerHeight: CGFloat = (tableView.frame.size.height - CGFloat(Int(tableView.rowHeight) * tableView.numberOfRows(inSection: 0))) / 2
if headerHeight > 0 {
    tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
} else {
    headerHeight = 0
    tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0/*-headerHeight*/, 0)
}

結果:

enter image description hereenter image description hereenter image description hereenter image description here

0
dory daniel

ストーリーボードのUIViewの上部(UIViewはTableViewの親である必要があります)にTableViewを追加します。その後、ビューを満たすように制約を設定します。次に、TableViewのサイズを設定し、その制約を垂直方向と水平方向の両方で上部UIViewの中央に配置するように設定します。これはあなたの問題を解決します。

0
Ersin Sezgin

私は私の計算が間違っている原因を見つけました。 self.tableView.bounds.size.heightの値は、viewWillAppearの実際の高さとは異なります。代わりにself.view.bounds.size.heightを使用しました。

0
Xchord