我有一个UITableViewController,它嵌入在UITabBarController中嵌入的UINavigationController中。
我正在尝试添加子视图以在条件未满足时阻挡导航栏和标签栏之间的区域,但我添加的子视图并非完全位于正确的位置。它似乎向上移动了状态栏和导航栏的高度组合(注意阴影区域下方的间隙......也应该加阴影)。
以下是我试图完成它的方法:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
setupLinks()
addBlockViewIfRequired()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
blockView.removeFromSuperview()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
setSizeOfBlockView()
}
func addBlockViewIfRequired() {
if dataModel.getAccounts().isEmpty {
if let navController = self.navigationController {
blockView.backgroundColor = UIColor.blackColor()
blockView.alpha = 0.5
setSizeOfBlockView()
navController.view.insertSubview(blockView, belowSubview: navController.navigationBar)
}
}
}
func setSizeOfBlockView() {
let blockViewRect = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)
blockView.frame = blockViewRect
}
关于我需要调整什么以使这个子视图正确放置的任何想法?谢谢!
编辑:以下是直接修复:
func setSizeOfBlockView() {
if let navController = self.navigationController {
let blockViewRect = CGRectMake(0, navController.navigationBar.frame.maxY, self.view.bounds.size.width, self.view.bounds.size.height)
blockView.frame = blockViewRect
}
}
和另一种方式:
func setSizeOfBlockView() {
if let navController = self.navigationController {
var blockViewRect = self.view.bounds
blockViewRect.origin.y = navController.navigationBar.frame.maxY
blockView.frame = blockViewRect
}
}
答案 0 :(得分:1)
为什么要尝试将此blockingView放入导航控制器的rootView ?
导航控制器应完全忽略特定的业务环境细节。修复很简单,但问题背后有一些基本的编程原则,所以想一想。 要求是"如果帐户为空,则显示blockView"。但是每个要求都有一个问题 - >谁应该负责处理这个要求?哪个实体/对象?
架构软件基本上是这些责任的划分 您的案例中用于显示阻止视图的正确负责实体是在 导航控制器堆栈中的viewController。如果我可以从屏幕截图中看出来,那就是显示表格视图的那个。
所以不是这个
navController.view.insertSubview(blockView, belowSubview:navController.navigationBar)
我希望在相应的视图控制器中使用私有便捷方法
setupBlockView() {
//here you set up your view..everything (color, content, position in view hierachy..whatever) **except** layout (size and position)
self.view.addSubView(blockView)
}
您可以从viewDidLoad
而不是viewDidAppear
调用此方法。据我所知,你有一个blockView属性,它将使视图保持活动状态。应该是私人btw。
接下来,在viewWillAppear
中,您将使用非常简单的
blockView.hidden = model.account.isEmpty
很高兴看到有人使用' layoutSubviews'布局子视图:)但是一旦你应用上面的更改..你的布局变得非常简单..摆脱方便的方法,只是直接在布局子视图中说
blockView.frame = self.view.bounds
边界方法是正确的。您只想复制大小,而不是非零位置。 您是否注意到我们如何摆脱许多代码行? :)
答案 1 :(得分:0)
我猜你的视图部分在你的导航栏下。您可以使用UI调试器进行双重检查。
您需要将blockViewRect.origin.y设置为导航栏的底部,例如
let blockViewRect = CGRectMake(0, navigationController?.navigationBar.frame.maxY, self.view.bounds.size.width, self.view.bounds.size.height)
只是为了好起来......
var blockViewRect = self.view.bounds
blockViewRect.origin.y = navigationController?.navigationBar.frame.maxY
仅供参考,正确的navigationController可能位于VC的parentViewControllers中。