ios 子视图添加到导航栏下方的可扩展视图中Y值不正确

zvms9eto  于 12个月前  发布在  iOS
关注(0)|答案(2)|浏览(114)

我有一个嵌入在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
  }

字符串
任何想法,我将需要调整,使这个子视图被正确放置?谢谢!

0qx6xfy6

0qx6xfy61#

为什么尝试将此blockingView放入导航控制器的rootView中?
导航控制器应该完全忽略特定的业务上下文细节。修复方法很简单,但问题背后有一些基本的编程原则,所以请考虑一下。要求是“如果帐户为空,则显示块视图”。但每个要求都有一个问题->谁应该负责处理此要求?哪个实体/对象?
架构软件基本上是这些职责的划分。
在你的例子中,显示阻塞视图的正确负责实体是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属性,它将保持视图的活动状态。顺便说一下,应该是私有的。
接下来,在viewWillAppear中,您将使用一个非常简单的

blockView.hidden = model.account.isEmpty


很高兴看到有人使用'layoutSubviews'来布局子视图:)但是一旦你应用了上面的更改..你的布局变得非常简单..摆脱方便的方法,直接在布局子视图中说

blockView.frame = self.view.bounds


边界方法是正确的。你只想复制大小,而不是非零位置。你有没有注意到我们摆脱了多少行代码?:)

bksxznpy

bksxznpy2#

我猜你的视图有一部分在导航栏下面。你可以使用UI调试器来仔细检查。
您需要将块ViewRect.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中。

相关问题