从ViewController超类以编程方式添加视图不会显示在前面

时间:2015-05-19 14:23:36

标签: ios swift uiviewcontroller viewdidload

我有一个我的UIViewControllers扩展的BaseViewController,所以我可以拥有我不需要重写的显式函数。我想要的是self.showSpinner()之类的函数,viewController会显示微调器

我的代码看起来像这样

class BaseViewController: UIViewController {

var actvIndicator : UIActivityIndicatorView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.actvIndicator = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)
    self.actvIndicator.color = UIColor.blackColor()
    self.actvIndicator.backgroundColor = UIColor.blackColor()
    self.actvIndicator.frame  = CGRectMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2, 100, 100);
    self.actvIndicator.center = self.view.center
    self.actvIndicator .startAnimating()
    self.view.addSubview(self.actvIndicator)
    self.actvIndicator.bringSubviewToFront(self.view)

    self.edgesForExtendedLayout = UIRectEdge.None
    self.navigationController?.navigationBar.translucent = false
}
func showSpinner(){

    self.actvIndicator.startAnimating()
}

func hideSpinner(){
    self.actvIndicator.stopAnimating()
}
}

我的viewcontrollers看起来像这样

class MyProjectViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.showSpinner()
    }
}

MyProjectViewControllerUITableView填充整个屏幕。当我设置tblProjects.alpha = 0时,我可以看到微调器。但我希望它在前面。

我也试过self.view.bringSubviewToFront(self.actvIndicator)

我缺少什么?

2 个答案:

答案 0 :(得分:2)

在我进入我认为您的问题之前的几个简短说明:

  1. 当您添加子视图时,它会自动添加到顶层,而不需要bringSubviewToFront:中的viewDidLoad:(无论如何都使用了错误)。
  2. 您不应在viewDidLoad中设置视图框架(例如,以视图为中心)。框架尚未设置,因此您应将其移至viewWillAppear:或其他变体。
  3. 现在您的问题很可能是一个视图层次结构问题(进一步通过您的评论确认),因此可以通过每次您希望它显示时将微调器推到前面来修复,例如:

    func showSpinner() {
        self.view.bringSubviewToFront(self.actvIndicator)
        self.actvIndicator.startAnimating()
    }
    

答案 1 :(得分:0)

这里的问题在于,在您调用self.view.bringSubviewToFront(self.actvIndicator)之后绘制了表格视图。可能的解决方法是在显示微调器时调用bringSubviewToFront

func showSpinner(){

    self.view.bringSubviewToFront(self.actvIndicator)
    self.actvIndicator.startAnimating()
}