关于 self.navigationController.view
相信看过 MBProgressHUD 官方例子 HudDemo
代码的同学应该看到过下述代码:
1 |
|
当时,你可能会对 self.navigationController.view
有些疑惑,这是什么玩意?其实,如果我们查看下 UINavigationController.h
文件就会发现,UINavigationController
其实是继承自 UIViewController
的,那么它拥有 view
属性也就不奇怪了。
1 |
|
下面,我们会结合 Reveal 清楚地看到 self.navigationController.view
到底是什么东西,稍安勿躁。
显示 MBProgressHUD
初始化 MBProgressHUD 时需要我们传入一个 UIView
类型的参数 view
,而显示 MBProgressHUD 的原理其实就是用 addSubview
方法将 MBProgressHUD 添加为这个 view
的子视图。
我们先来看看未显示 MBProgressHUD 时,应用的视图层次结构。其中 1 为 UIWindow
,即 self.view.window
,2 是 UINavigationController
的 view
,即我们前面提到的 self.navigationController.view
,3 为 self.view
,4 为导航栏 UINavigationBar
,即 self.navigationController.navigationBar
。
通过这张图,我们清楚地看到了 self.view.window
、self.navigationController.view
、self.view
和 self.navigationController.navigationBar
在应用的视图层次中所处的位置,以及它们之间的层次关系。
下面,我们就对比一下 MBProgressHUD 分别在 self.view.window
、self.navigationController.view
和 self.view
上显示时应用的视图层次结构,以及导航栏上按钮的可用情况。
方式 1 - On self.view.window
使用这种方式时,MBProgressHUD 被添加到了 self.view.window
上,它与 self.navigationController.view
在视图层次上是平级的,同为 self.view.window
的子视图。但是由于 MBProgressHUD 是后添加的,所以它处于 self.navigationController.view
的上方,因此导航栏上的按钮均不可点击。
方式 2 - On self.navigationController.view
使用这种方式时,MBProgressHUD 被添加到了 self.navigationController.view
上,它与 self.navigationController.navigationBar
在视图层次上是平级的,同为 self.navigationController.view
的子视图。但是由于 MBProgressHUD 是后添加的,所以它处于 self.navigationController.navigationBar
的上方,因此导航栏上的按钮也均不可点击。
方式 3 - On self.view
使用这种方式时,MBProgressHUD 被添加到了 self.view
上,不管 self.view
或 MBProgressHUD 是否占满整个屏幕,self.navigationController.navigationBar
永远处于 MBProgressHUD 的上方。因此,导航栏上的按钮一直是可点击的。
总结
当你需要让导航栏上的按钮不可点击的时候,可以选择使用 方式 1
或 方式 2
显示 MBProgressHUD 。反之,可以选择 方式 3
。
参考链接:
1.http://blog.leichunfeng.com/blog/2015/03/16/talking-about-the-usage-of-mbprogresshud-combined-with-reveal/