Ios topLayoutGuide在导航控制器按下后移动

Ios topLayoutGuide在导航控制器按下后移动,ios,iphone,swift,nslayoutconstraint,Ios,Iphone,Swift,Nslayoutconstraint,我有一个简单的视图控制器层次结构,其中一个视图控制器使用UINavigationController显示。在viewDidLoad中,它使用约束设置视图。在视图完全可见之前(动画期间),topLayoutGuide是状态栏,当视图完全显示在屏幕上时,它将变为UINavigationBar的底部。这会导致视图跳跃 删除“在顶部栏下延伸边”选项可修复此问题,但会使导航栏出现不需要的灰色渐变,设置导航栏的背景色只能部分纠正此问题 是否有办法让topLayoutGuide即使在动画期间也参考导航栏的底部

我有一个简单的视图控制器层次结构,其中一个视图控制器使用UINavigationController显示。在
viewDidLoad
中,它使用约束设置视图。在视图完全可见之前(动画期间),
topLayoutGuide
是状态栏,当视图完全显示在屏幕上时,它将变为UINavigationBar的底部。这会导致视图跳跃

删除“在顶部栏下延伸边”选项可修复此问题,但会使导航栏出现不需要的灰色渐变,设置导航栏的
背景色只能部分纠正此问题


是否有办法让
topLayoutGuide
即使在动画期间也参考导航栏的底部?这在以前是可行的,但在iOS 10中的Xcode 8.0中不起作用。

通过注释掉大量代码,我在从
viewDidLoad()调用的一个设置函数中找到了罪魁祸首。对不起,我的问题没有包含足够的细节来解决它。如果将来有人看到这种症状,下面是重新创建错误的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    let label = UILabel(frame: CGRect.zero)
    label.text = "Testing"
    label.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(label)
    self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: topLayoutGuide, attribute: .bottom, multiplier: 1, constant: 0))
    self.view.layoutIfNeeded()
}

解决方案是删除
layoutifneed()
调用。约束在
viewDidLoad()
之后生效,在其中调用
layoutifneed()
将临时使用
topLayoutGuide

您只是在
viewDidLoad
中设置约束?这应该像你期望的那样工作,没有跳跃。你能分享你运行的代码吗?@LeoNatan谢谢你的提示。在简化代码以发布到这里的同时,我发现了问题所在。请看下面我的答案。我非常感谢你,这正是我需要的信息。我的代码中有大量的
setNeedsLayout()
layoutifneed()
调用,这些调用也在viewDidLoad()中执行。删除了那些电话,瞧!