当前视图与UINavigationController的导航栏重叠

Mik*_*e H 2 layout uinavigationbar uinavigationcontroller ios swift

我正在以编程方式为我的应用程序设计一个注册页面视图,用户可以在其中输入自己的图像和一些信息。

在我的LoginController中,创建一个UINavigationController并带有我的RegisterController的rootviewcontroller,然后将其显示。

func handleRegisterButtonClicked() {
    let registerController = RegisterController()
    let navController = UINavigationController(rootViewController: registerController)
    present(navController, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

现在,我为他们添加了图片,以供单击以上传他们的照片。我希望此图片始终在导航栏下方显示30px,但要重叠在导航栏下方,从屏幕顶部显示30px:

肖像导向 风景导向

class RegisterController: UIViewController {
...
func setupViews() {
    profilePic.topAnchor.constraint(equalTo: view.topAnchor, constant: 30).isActive = true
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以向profilePic添加约束,以便将其锚定在导航栏的底部(纵向和横向)?

Pao*_*olo 7

而不是view.topAnchor尝试topLayoutGuide.bottomAnchor。这应该将其固定在导航栏的底部(视图控制器的“顶部布局指南”)。

func setupViews() {
    profilePic.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 30).isActive = true
}
Run Code Online (Sandbox Code Playgroud)

iOS 11或更高版本

在iOS 11中topLayoutGuidebottomLayoutGuide不推荐使用,而推荐使用safeAreaLayoutGuide(这是UIView属性,而不是UIViewController)。

如果您的应用程序支持iOS 11,则应执行以下操作:

func setupViews() {
    if #available(iOS 11.0, *) {
        profilePic.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 30).isActive = true
    } else {
        profilePic.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 30).isActive = true
    }
}
Run Code Online (Sandbox Code Playgroud)

如果/当您的应用仅支持iOS 11或更高版本时,您可以删除条件可用性检查并仅使用该safeAreaLayoutGuide版本。