将活动指示器放在合适的视图上

时间:2015-03-27 22:16:32

标签: swift

我在故事板中的UITableView内放置了一个活动指示器。 如何将其置于屏幕中间和桌面视图前面?

我试过了:

self.activityIndicator.center = self.tableView.center

但是现在,活动指标位于视图的中上方!

7 个答案:

答案 0 :(得分:34)

要在UITableView中加载数据时显示活动指示器,您可以创建UIView并将其添加到主视图(位于UITableView的中心)。如果要显示如下所示:

enter image description here

您可以使用功能setLoadingScreenremoveLoadingScreen执行此操作(如果您想查看可以进行的示例项目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的指示。

  1. 拖动表视图顶部的视图步骤
  2. 拖动活动     指示视图
  3. 将活动指示符对齐     容器中的水平和垂直中心

  4. 制作IBOutlet     视图和活动指示符的连接

  5. 开始吧     活动指标
  6. 停止并隐藏:activityIndicatorLarge.hidesWhenStopped = true activityView.hidden = true

答案 2 :(得分:9)

最简单的方法是在tableView backgroundView

中添加UIActivityIndi​​catorView
    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类的存储属性。