UITableView
aの中心に aを実装したいと思いUIView
ます。最初は 2 行または 3 行しかありません。ユーザーがさらに行を追加すると、以下に示すように、コンテンツ全体が中央に配置されたまま、垂直方向に拡張されます。
でそれを行うことは可能UITableView
ですか?
UITableView
aの中心に aを実装したいと思いUIView
ます。最初は 2 行または 3 行しかありません。ユーザーがさらに行を追加すると、以下に示すように、コンテンツ全体が中央に配置されたまま、垂直方向に拡張されます。
でそれを行うことは可能UITableView
ですか?
UIScrollView のcontentOffset
プロパティを使用して実行できます。
tableView のフレームを境界内に配置します。
tableView.frame = self.view.bounds;
tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
メソッドを宣言します -layoutTableView:
- (void)layoutTableView {
CGSize contentSize = tableView.contentSize;
CGSize boundsSize = tableView.bounds.size;
CGFloat yOffset = 0;
if(contentSize.height < boundsSize.height) {
yOffset = floorf((boundsSize.height - contentSize.height)/2);
}
tableView.contentOffset = CGPointMake(0, yOffset);
}
を呼び出すときは、後で呼び出す[tableView reloadData]
だけです。[self layoutTableView]
別の解決策は、コンテンツ オフセット ソリューションが機能しなかったため、テーブル ビューのコンテンツ インセットを調整することです。基本的な考え方は次のとおりです (カスタム UITableView サブクラスに挿入されます)。
- (void)reloadData {
[super reloadData];
[self centerTableViewContentsIfNeeded];
}
- (void)layoutSubviews {
[super layoutSubviews];
[self centerTableViewContentsIfNeeded];
}
- (void)centerTableViewContentsIfNeeded {
CGFloat totalHeight = CGRectGetHeight(self.bounds);
CGFloat contentHeight = self.contentSize.height;
//If we have less content than our table frame then we can center
BOOL contentCanBeCentered = contentHeight < totalHeight;
if (contentCanBeCentered) {
self.contentInset = UIEdgeInsetsMake(ceil(totalHeight/2.f - contentHeight/2.f), 0, 0, 0);
} else {
self.contentInset = UIEdgeInsetsZero;
}
}
迅速な心のためにここに遊び場があります:
import UIKit
import Foundation
import XCPlayground
class CenteredTable: UITableView {
override func reloadData() {
super.reloadData()
centerTableContentsIfNeeded()
}
override func layoutSubviews() {
super.layoutSubviews()
centerTableContentsIfNeeded()
}
func centerTableContentsIfNeeded() {
let totalHeight = CGRectGetHeight(bounds)
let contentHeight = contentSize.height
let contentCanBeCentered = contentHeight < totalHeight
if (contentCanBeCentered) {
contentInset = UIEdgeInsets(top: ceil(totalHeight/2 - contentHeight/2), left: 0, bottom: 0, right: 0);
} else {
contentInset = UIEdgeInsetsZero;
}
}
}
class DataSource: NSObject, UITableViewDataSource {
let items = ["Mr", "Anderson", "Welcome", "Back", "We", "Missed", "You"]
func registerReusableViewsWithTable(tableView: UITableView) {
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel?.text = items[indexPath.row]
cell.textLabel?.textAlignment = .Center
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
}
let dataSource = DataSource()
let table = CenteredTable(frame: CGRectMake(0, 0, 300, 800), style: UITableViewStyle.Plain)
table.tableFooterView = UIView(frame: CGRectZero)
let container = UIView(frame: table.frame)
container.addSubview(table)
dataSource.registerReusableViewsWithTable(table)
table.dataSource = dataSource
table.reloadData()
XCPShowView("table", container)
container
テーブルビューでヘッダーを使用しない場合は、テーブルビューのバインドされた高さと比較して、セルの高さを動的に計算できます。
https://stackoverflow.com/a/15026532/1847601への 称賛
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
CGFloat contentHeight = 0.0;
for (int section = 0; section < [self numberOfSectionsInTableView: tableView]; section++) {
for (int row = 0; row < [self tableView: tableView numberOfRowsInSection: section]; row++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow: row inSection: section];
contentHeight += [self tableView: tableView heightForRowAtIndexPath: indexPath];
}
}
return (tableView.bounds.size.height - contentHeight)/2;
}
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *view = [[UIView alloc] initWithFrame: CGRectZero];
view.backgroundColor = [UIColor clearColor];
return view;
}
スイフト3
private func hightTableView() {
yourTableView.frame = CGRect(x: 0, y: Int((Int(view.frame.height) - rowHeight * yourArrayData.count) / 2), width: widthTable, height: rowHeight * yourArrayData.count)
}