我有一个嵌入在UINavigationController中的可扩展视图控制器,该UINavigationController嵌入在一个可扩展的BarController中。
我试图添加一个子视图来遮挡导航栏和标签栏之间的区域,当一个条件不满足时,但是我添加的子视图并不完全在正确的位置。它似乎向上移动了状态栏和导航栏的高度(注意阴影区域下面的差距.
x1c 0d1x的数据
我是这么做的
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
}
字符串
任何想法,我将需要调整,使这个子视图被正确放置?谢谢!
2条答案
按热度按时间0qx6xfy61#
为什么尝试将此blockingView放入导航控制器的rootView中?
导航控制器应该完全忽略特定的业务上下文细节。修复方法很简单,但问题背后有一些基本的编程原则,所以请考虑一下。要求是“如果帐户为空,则显示块视图”。但每个要求都有一个问题->谁应该负责处理此要求?哪个实体/对象?
架构软件基本上是这些职责的划分。
在你的例子中,显示阻塞视图的正确负责实体是viewController,它在**导航控制器的堆栈中。如果我可以从截图中假设的话,它就是显示表视图的那个。
所以,
字符串
我希望在相应的视图控制器中有一个私有的方便方法
型
你从
viewDidLoad
而不是viewDidAppear
调用这个方法。据我所知,你有一个blockView属性,它将保持视图的活动状态。顺便说一下,应该是私有的。接下来,在
viewWillAppear
中,您将使用一个非常简单的型
很高兴看到有人使用'layoutSubviews'来布局子视图:)但是一旦你应用了上面的更改..你的布局变得非常简单..摆脱方便的方法,直接在布局子视图中说
型
边界方法是正确的。你只想复制大小,而不是非零位置。你有没有注意到我们摆脱了多少行代码?:)
bksxznpy2#
我猜你的视图有一部分在导航栏下面。你可以使用UI调试器来仔细检查。
您需要将块ViewRect.origin.y设置到导航栏的底部,例如:
字符串
为了美化一下...
型
仅供参考,正确的navigationController可能位于VC的某个parentViewControllers中。