ios 如何垂直对齐(居中)UITableView的内容?

at0kjp5o  于 2023-03-14  发布在  iOS
关注(0)|答案(9)|浏览(226)

我希望将UITableView的内容居中,其中包含在故事板中创建的headerViewfooterView,以及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;
}

所以我用tableView的高度减去navigationBar & statusBar的高度和单元格的高度得到了空白区域的高度,现在我得到了空白区域的高度,我把它除以2得到了页脚和页眉视图的高度。

unhi4e5o

unhi4e5o1#

视图将出现从界面方向旋转函数中:

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

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

这会解决你的问题。

编辑

viewWillLayoutSubviews中以及每次重新加载数据后调用更新表视图内容插入函数:

目标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);
}

雨燕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)
}
t1qtbnec

t1qtbnec2#

重写viewDidLayoutSubviews并将tableView的frame与其contentSize进行比较以设置其contentInset

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)
}

这适用于自调整表视图单元格👌

8ljdwjyq

8ljdwjyq3#

使用UITableViewcontentSize属性,这样就不必考虑单元格heightcount

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

在重新加载tableView-数据之后,以及当tableView的包含视图变为可见时(viewWillAppear:)和当其更改大小时(viewWillTransitionToSize:withTransitionCoordinator:),更新contentInsets

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

b1payxdu4#

基于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)
busg9geu

busg9geu5#

在故事板中TableView的顶部添加一个UIView(UIView应该是TableView的父级)。然后设置其约束以填充视图。现在,设置TableView的大小并设置其约束以垂直和水平居中顶部UIView。这将解决您的问题。

vcirk6k6

vcirk6k66#

我发现了导致计算错误的原因。self.tableView.bounds.size.height的值与viewWillAppear中的实际高度不同。我使用self.view.bounds.size.height代替。

z8dt9xmd

z8dt9xmd7#

适用于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)
}

结果:

第一节第一节第一节第一节第二节第一节第三节第一节

xcitsw88

xcitsw888#

您可以使用KVO来观察tableView的contentSize何时发生变化。我发现这是使用自动行高时的最佳方法。

override func viewDidLoad() {
    super.viewDidLoad()        
    tableView.addObserver(self, forKeyPath: "contentSize", context: nil)
}

deinit {
    tableView.removeObserver(self, forKeyPath: "contentSize")
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if (keyPath == "contentSize") {
        if (tableView.contentSize.height < tableView.frame.height) {
            let inset = (tableView.frame.height - tableView.contentSize.height) / 2
            tableView.contentInset = UIEdgeInsets(top: inset, left: 0, bottom: inset, right: 0)
        } else {
            tableView.contentInset = UIEdgeInsets.zero
        }
    }
}
nwwlzxa7

nwwlzxa79#

像这样设置UITableView的框架

CGFloat width = self.view.frame.size.width;
CGFloat height = self.view.frame.size.height;
CGFloat tableHeight = 200.0; //your table height
self.tableView.frame = CGRectMake(0,(height-tableHeight)/2,width,tableHeight);

或者试试这个

相关问题