相信看过 MBProgressHUD 官方例子 HudDemo
代码的同学应该看到过下述代码:
1
|
|
当时,你可能会对 self.navigationController.view
有些疑惑,这是什么玩意?其实,如果我们查看下 UINavigationController.h
文件就会发现,UINavigationController
其实是继承自 UIViewController
的,那么它拥有 view
属性也就不奇怪了。
1
|
|
下面,我们会结合 Reveal 清楚地看到 self.navigationController.view
到底是什么东西,稍安勿躁。
初始化 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
上显示时应用的视图层次结构,以及导航栏上按钮的可用情况。
使用这种方式时,MBProgressHUD 被添加到了 self.view.window
上,它与 self.navigationController.view
在视图层次上是平级的,同为 self.view.window
的子视图。但是由于 MBProgressHUD 是后添加的,所以它处于 self.navigationController.view
的上方,因此导航栏上的按钮均不可点击。
使用这种方式时,MBProgressHUD 被添加到了 self.navigationController.view
上,它与 self.navigationController.navigationBar
在视图层次上是平级的,同为 self.navigationController.view
的子视图。但是由于 MBProgressHUD 是后添加的,所以它处于 self.navigationController.navigationBar
的上方,因此导航栏上的按钮也均不可点击。
使用这种方式时,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/
原文:http://www.cnblogs.com/Jenaral/p/5759165.html