我在故事板中的UITableView
内放置了一个活动指示器。
如何将其置于屏幕中间和桌面视图前面?
我试过了:
self.activityIndicator.center = self.tableView.center
但是现在,活动指标位于视图的中上方!
答案 0 :(得分:34)
要在UITableView
中加载数据时显示活动指示器,您可以创建UIView并将其添加到主视图(位于UITableView
的中心)。如果要显示如下所示:
您可以使用功能setLoadingScreen
和removeLoadingScreen
执行此操作(如果您想查看可以进行的示例项目here):
class TableViewController: UITableViewController {
// MARK: Properties
/// Data source of the tableView
var rows: [String] = []
/// View which contains the loading text and the spinner
let loadingView = UIView()
/// Spinner shown during load the TableView
let spinner = UIActivityIndicatorView()
/// Text shown during load the TableView
let loadingLabel = UILabel()
// MARK: Methods
override func viewDidLoad() {
super.viewDidLoad()
setLoadingScreen()
loadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rows.count
}
override func tableView(tableView: UITableView, cellForRowAt indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)!
cell.textLabel!.text = rows[indexPath.row]
return cell
}
// MARK: Private methods
// Load data in the tableView
private func loadData() {
// Simulate a delay of some operations as a HTTP Request
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(20)) {
self.rows = ["Row 1", "Row 2", "Row 3", "Row 4", "Row 5"]
self.tableView.reloadData()
self.tableView.separatorStyle = .singleLine
self.removeLoadingScreen()
}
}
// Set the activity indicator into the main view
private func setLoadingScreen() {
// Sets the view which contains the loading text and the spinner
let width: CGFloat = 120
let height: CGFloat = 30
let x = (tableView.frame.width / 2) - (width / 2)
let y = (tableView.frame.height / 2) - (height / 2) - (navigationController?.navigationBar.frame.height)!
loadingView.frame = CGRect(x: x, y: y, width: width, height: height)
// Sets loading text
loadingLabel.textColor = .gray
loadingLabel.textAlignment = .center
loadingLabel.text = "Loading..."
loadingLabel.frame = CGRect(x: 0, y: 0, width: 140, height: 30)
// Sets spinner
spinner.activityIndicatorViewStyle = .gray
spinner.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
spinner.startAnimating()
// Adds text and spinner to the view
loadingView.addSubview(spinner)
loadingView.addSubview(loadingLabel)
tableView.addSubview(loadingView)
}
// Remove the activity indicator from the main view
private func removeLoadingScreen() {
// Hides and stops the text and the spinner
spinner.stopAnimating()
spinner.isHidden = true
loadingLabel.isHidden = true
}
}
答案 1 :(得分:21)
以下是步骤:遵循Chrissukhram的指示。
将活动指示符对齐 容器中的水平和垂直中心
制作IBOutlet 视图和活动指示符的连接
activityIndicatorLarge.hidesWhenStopped = true
activityView.hidden = true
答案 2 :(得分:9)
最简单的方法是在tableView backgroundView
中添加UIActivityIndicatorView let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
spinner.startAnimating()
tableView.backgroundView = spinner
默认情况下它会居中。
答案 3 :(得分:4)
如果您使用复杂视图:
func setupSpinner(){
spinner = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height:40))
spinner.color = UIColor(Colors.Accent)
self.spinner.center = CGPoint(x:UIScreen.main.bounds.size.width / 2, y:UIScreen.main.bounds.size.height / 2)
self.view.addSubview(spinner)
spinner.hidesWhenStopped = true
}
答案 4 :(得分:3)
如果此活动指示符用于将信息加载到UITableView
,则应创建与UIView
大小相同的单独加载UITableView
,并将活动指标放在中心位置那个观点,而不是UITableView
本身。
然后将加载UIView
添加到主视图(在表格视图上方)并根据加载状态将其设置为隐藏或可见。
答案 5 :(得分:2)
我认为您在故事板中直接使用了UITableView。这就是为什么你不能将uiview拖到主视图(tableview)的顶部。删除UItableview控制器并将UIViewController拖到故事板中。然后将tableview拖入其中。然后在tableview上拖动另一个视图以查看活动指示不要忘记在UIViewController中处理UItableviewdelegate和datasourse方法。
答案 6 :(得分:0)
在tableViewController的viewDidLayoutSubviews
方法中,尝试以下操作:
override func viewDidLayoutSubviews() {
let screenSize = UIScreen.main.bounds
activityIndicator.frame = CGRect(x: screenSize.width / 2, y: screenSize.height / 2, width: 5, height: 5)
activityIndicator.color = .white
activityIndicator.hidesWhenStopped = true
if let baseView = view.superview {
baseView.addSubview(activityIndicator)
}
}
activityIndicator
是我的TableViewController
类的存储属性。