当前视图底层UINavigationController的导航栏

时间:2017-08-30 23:14:56

标签: ios swift layout uinavigationcontroller uinavigationbar

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

在我的LoginController中,我使用我的RegisterController的rootviewcontroller创建一个UINavigationController,然后显示它。

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

现在我为他们添加了一张图片,点击上传他们的照片。我希望这张照片总是在导航栏下面显示30px,而是重叠导航栏,从屏幕顶部显示30px:

Portrait Orientated Landscape Orientated

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

有没有办法为profilePic添加约束,以便将其锚定到导航栏的底部(纵向和横向)?

3 个答案:

答案 0 :(得分:4)

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

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

iOS 11或更高版本

在iOS 11 topLayoutGuidebottomLayoutGuide中,我们不推荐使用safeAreaLayoutGuideUIView属性,而不是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
    }
}

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

答案 1 :(得分:0)

就我而言,我还必须为给定的视图控制器禁用edgesForExtendedLayout属性。

edgesForExtendedLayout = []

答案 2 :(得分:0)

我通过使导航栏不透明来解决此问题:

在RegisterController中,尝试以下操作:

- (void)viewDidLoad{
    [super viewDidLoad];
    self.navigationController.navigationBar.translucent = NO;
}