Индикатор активности позиции над удобным видом
Я разместил индикатор активности в UITableView
в раскадровке.
Как я могу центрировать его в середине экрана и перед представлением таблицы?
Я пробовал:
self.activityIndicator.center = self.tableView.center
Но теперь индикатор активности находится в верхней части окна просмотра!
Ответы
Ответ 1
Вот шаги: Последующие инструкции Криссухрама.
Ответ 2
Чтобы отобразить индикатор активности во время загрузки данных в UITableView
, вы можете создать UIView и добавить его в основной вид (в центре UITableView
). Если вы хотите отобразить его, как показано ниже:
![введите описание изображения здесь]()
Вы можете сделать это с помощью fnuctions setLoadingScreen
и removeLoadingScreen
(если вы хотите увидеть пример проекта, вы можете пойти здесь)
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
}
}
Ответ 3
Если этот индикатор активности предназначен для загрузки информации в UITableView
, вы должны создать отдельную загрузку UIView
с тем же размером, что и UITableView
, и поместите индикатор активности в центр этого представления, а не UITableView
.
Затем добавьте загрузку UIView
в основной вид (над табличным представлением) и установите ее в скрытую или видимую в зависимости от состояния загрузки.
Ответ 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
}
Ответ 5
Я думаю, что вы использовали непосредственно UITableView в своем раскадровке. Вот почему вы не можете перетаскивать верхнюю часть uiview основного вида (tableview). Удалите контроллер UItableview и перетащите UIViewController в раскадровку. Затем перетащите в него табличное представление. затем перетащите другой вид над табличным представлением для индикатора активности. не забывайте обрабатывать методы UItableviewdelegate и datasourse в вашем UIViewController.