UITableViewController中同级添加UIActivityIndicatorView失败的解决方法咨询
解决UITableViewController中添加UIActivityIndicatorView的布局问题
这个问题我之前也碰到过,核心原因是UITableViewController的根视图本身就是自带的UITableView,和普通UIViewController的视图结构完全不同:普通UIViewController是用一个普通UIView当根视图,再把tableView作为子视图;而UITableViewController的self.view直接就是那个tableView。所以你直接把指示器加在self.view上,本质是把它变成了tableView的子视图,自然会受tableView的布局、滚动逻辑影响,出现不符合预期的效果。
下面给你两种实用的解决思路:
方案1:改用UIViewController管理UITableView(最省心)
这完全贴合你之前成功的做法:
- 新建一个普通的
UIViewController,手动拖一个UITableView到控制器视图里,设置约束让它铺满整个屏幕。 - 把
UIActivityIndicatorView也添加到控制器的根视图上,和tableView同级,按照你之前的方式设置居中布局就行。 - 最后让这个控制器遵守
UITableViewDataSource和UITableViewDelegate协议,实现对应的数据源、代理方法,用法和UITableViewController几乎没区别,还能更灵活地控制视图层级。
方案2:在UITableViewController中正确配置指示器
如果一定要用UITableViewController,那可以这么做:
- 把指示器添加到
self.view(也就是自带的tableView)上,然后用Auto Layout给它加居中约束,确保它始终固定在屏幕中间,不受tableView滚动或自动inset的影响。示例代码(Swift):let loadingIndicator = UIActivityIndicatorView(style: .large) loadingIndicator.translatesAutoresizingMaskIntoConstraints = false loadingIndicator.hidesWhenStopped = true // 停止动画时自动隐藏 self.view.addSubview(loadingIndicator) // 添加居中约束 NSLayoutConstraint.activate([ loadingIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor), loadingIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor) ]) loadingIndicator.startAnimating() - 如果发现指示器被tableView的cell挡住了,再加一行代码把它提到最上层:
self.view.bringSubviewToFront(loadingIndicator)
内容的提问来源于stack exchange,提问作者pulp
相关产品推荐
相关产品推荐

