1

您好,我更新到新的 Xcode 9 并开始使用 safeAreaLayout 指南来支持 iphone X。从 xib 中,我只是使用了 safeAreaLayout 指南,并通过顶部和底部约束调整为 safeArea。

这是我得到的

iphone X (iOS 11)

苹果手机 6 (iOS 11)

如您所见,我的自定义导航栏下降了 20pxls

iPhone 6(iOS 9 和 10)

在这里你可以看到导航栏是如何从 0 开始并合并状态栏的。

实际上,

1)我希望绿色填充缺口。2) 状态栏不应显示为白色,而是显示为绿色,如 3 图像中所示。

我已经搜索了很多解决方案。但没有一个工作。所以我需要帮助。

问候兰吉特

4

3 回答 3

0

您的自定义栏视图的布局如下:

[nav.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor];

任何受限于 view.safeAreaLayoutGuide.topAnchor 的东西都将位于 statusBar + navigationBar 下方,因为那是安全区域。如果它受限于 safeAreaLayoutGuide.bottomAnchor,那么它将位于所有 tabBars 或底部栏之上,以便 iPhone X 用户可以向上滑动而不触及您的视图..

但是,任何受限于 view.topAnchor 的东西都将受限于视图的顶部(IE:屏幕)。

因此,将您的自定义视图限制在控制器视图的顶部。然后在 中viewDidLayoutSubviews,添加safeAreaInsets.top到高度。这将允许您的视图触摸屏幕顶部,但高/大到足以延伸到导航栏下方。您将需要调整视图的内容以在相同的插图顶部进一步向下布局。

//
//  ViewController.swift
//  SONav
//
//  Created by Brandon Anthony on 2017-11-17.
//  Copyright © 2017 SO. All rights reserved.
//

import UIKit

class CustomNav : UINavigationBar {

    var desiredHeight: CGFloat = 88.0

    override init(frame: CGRect) {
        super.init(frame: frame)

        desiredHeight = frame.size.height
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var size = super.sizeThatFits(size)
        size.height = desiredHeight
        return size
    }

    override var frame: CGRect {
        get {
            return super.frame
        }

        set {
            var frm = newValue
            frm.size.height = desiredHeight
            super.frame = frm
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        for subview in self.subviews {
            if NSStringFromClass(type(of: subview)).contains("Background") {
                subview.frame.size.height = 0
            }
            else if NSStringFromClass(type(of: subview)).contains("ContentView") {
                subview.frame.origin.y = 0
            }
        }
    }
}

class CustomNavigationController : UINavigationController {
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        super.willTransition(to: newCollection, with: coordinator)
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

class ViewController: UIViewController {
    var customNav: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Navigation Bar Setup
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.view.backgroundColor = UIColor.clear
        self.navigationController?.navigationBar.backgroundColor = UIColor.clear
        self.navigationController?.navigationBar.shadowImage = nil

        self.view.backgroundColor = UIColor.white
        self.customNav = CustomNav(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 100))
        self.customNav.backgroundColor = UIColor.blue
        self.view.addSubview(self.customNav!)

        NSLayoutConstraint.activate([
            self.customNav.leftAnchor.constraint(equalTo: self.view.leftAnchor),
            self.customNav.rightAnchor.constraint(equalTo: self.view.rightAnchor),
            self.customNav.topAnchor.constraint(equalTo: self.view.topAnchor),
            self.customNav.heightAnchor.constraint(equalToConstant: 100.0)
        ])

        self.customNav.translatesAutoresizingMaskIntoConstraints = false
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
于 2017-11-16T19:30:12.933 回答
0

1-您应该为视图的顶级约束选择超级视图(如果没有)

在此处输入图像描述

2- 双击此约束。如果你看到Margin

在此处输入图像描述

3-取消选中相对于保证金

在此处输入图像描述

04-再次设置约束值

于 2017-11-16T19:38:59.450 回答
0

状态栏的背景显示其下方视图的颜色。要更改“状态栏的颜色”,您需要在其后面放置一个视图并为该视图提供背景颜色。

要解决您的问题,最简单的解决方案是创建一个单独的视图,该视图始终是状态栏的高度,并且与您的自定义导航视图具有相同的背景颜色。

为此,请将新视图的顶部固定到超级视图的顶部,并将其底部固定到自定义导航视图的顶部。

此解决方案比将顶部安全区域插图的高度添加到自定义导航视图更简单,因为它避免了调整自定义视图的布局以解决这个额外的可变高度。

于 2017-11-16T19:32:46.643 回答