导航栏颜色不在状态栏下
Navigation bar color is not under status bar
我正在尝试制作一个透明的导航栏,但是当我将其设置为透明时,它看起来像这样...:
我希望它看起来像这样
但像在 App Store 中一样透明和模糊,但有背景色。问题是导航控制器的背景颜色不像正常的状态栏。
我的代码:
self.navigationItem.title = "label"
self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
self.navigationBar.backgroundColor = UIColor.init(red: 255/255, green: 0, blue: 0, alpha: 0.7)
编辑:我为 UINavigationController
定制了 class,视图控制器嵌入在 UINavigationController
中
Swift 3,Xcode 8.0 测试版 5。
让我们把这个问题分解成几个部分。首先,您需要使用通过 UIBlurEffect
创建的 UIVisualEffectView
来获得您想要的 blurred/transparent 效果。然后你需要弄清楚如何在导航栏中显示它,以便它填充整个导航栏和状态栏。
第 1 部分
我创建了 UIVisualEffectView
的子类以添加渐变。我们可以使用此视图创建所需的 blurred/transparent 效果。
class GradientVisualEffectView: UIVisualEffectView {
private let gradient: CAGradientLayer = {
// You can tweak these colors and their alpha to get the desired gradient.
// You can also mess with the gradient's locations.
[=10=].colors = [
UIColor.white.withAlphaComponent(0.3).cgColor,
UIColor(red: 1, green: 0, blue: 0, alpha: 0.7).cgColor
]
return [=10=]
} (CAGradientLayer())
override init(effect: UIVisualEffect?) {
super.init(effect: effect)
layer.addSublayer(gradient)
}
override func layoutSubviews() {
super.layoutSubviews()
// Make sure the gradient's frame always matches the blur effect.
gradient.frame = bounds
}
}
第 2 部分
现在我们需要在导航栏中使用这个视图。我在嵌入 UINavigationController
.
的 UIViewController
中执行此操作
override func viewDidLoad() {
super.viewDidLoad()
// Remove the nav bar's background
let navBar = navigationController!.navigationBar
navBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
navBar.backgroundColor = .clear
// Create the blur/transparent view. You can mess with styles here to get
// different effects.
let gradientBlur = GradientVisualEffectView(effect: UIBlurEffect(style: .light))
gradientBlur.translatesAutoresizingMaskIntoConstraints = false
navBar.addSubview(gradientBlur)
// Constrain the view so that it always matches the nav bar.
// The top constraint has a -20 constant so that it will extend above
// the nav bar to the status bar.
gradientBlur.leftAnchor.constraint(equalTo: navBar.leftAnchor).isActive = true
gradientBlur.topAnchor.constraint(equalTo: navBar.topAnchor, constant: -20).isActive = true
gradientBlur.rightAnchor.constraint(equalTo: navBar.rightAnchor).isActive = true
gradientBlur.bottomAnchor.constraint(equalTo: navBar.bottomAnchor).isActive = true
}
下面是我的模拟器的结果图片。可以看到图片左上角有一些模糊的文字,其中状态栏的白色部分看起来更暗
我正在尝试制作一个透明的导航栏,但是当我将其设置为透明时,它看起来像这样...:
我希望它看起来像这样
但像在 App Store 中一样透明和模糊,但有背景色。问题是导航控制器的背景颜色不像正常的状态栏。
我的代码:
self.navigationItem.title = "label"
self.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
self.navigationBar.backgroundColor = UIColor.init(red: 255/255, green: 0, blue: 0, alpha: 0.7)
编辑:我为 UINavigationController
定制了 class,视图控制器嵌入在 UINavigationController
Swift 3,Xcode 8.0 测试版 5。
让我们把这个问题分解成几个部分。首先,您需要使用通过 UIBlurEffect
创建的 UIVisualEffectView
来获得您想要的 blurred/transparent 效果。然后你需要弄清楚如何在导航栏中显示它,以便它填充整个导航栏和状态栏。
第 1 部分
我创建了 UIVisualEffectView
的子类以添加渐变。我们可以使用此视图创建所需的 blurred/transparent 效果。
class GradientVisualEffectView: UIVisualEffectView {
private let gradient: CAGradientLayer = {
// You can tweak these colors and their alpha to get the desired gradient.
// You can also mess with the gradient's locations.
[=10=].colors = [
UIColor.white.withAlphaComponent(0.3).cgColor,
UIColor(red: 1, green: 0, blue: 0, alpha: 0.7).cgColor
]
return [=10=]
} (CAGradientLayer())
override init(effect: UIVisualEffect?) {
super.init(effect: effect)
layer.addSublayer(gradient)
}
override func layoutSubviews() {
super.layoutSubviews()
// Make sure the gradient's frame always matches the blur effect.
gradient.frame = bounds
}
}
第 2 部分
现在我们需要在导航栏中使用这个视图。我在嵌入 UINavigationController
.
UIViewController
中执行此操作
override func viewDidLoad() {
super.viewDidLoad()
// Remove the nav bar's background
let navBar = navigationController!.navigationBar
navBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
navBar.backgroundColor = .clear
// Create the blur/transparent view. You can mess with styles here to get
// different effects.
let gradientBlur = GradientVisualEffectView(effect: UIBlurEffect(style: .light))
gradientBlur.translatesAutoresizingMaskIntoConstraints = false
navBar.addSubview(gradientBlur)
// Constrain the view so that it always matches the nav bar.
// The top constraint has a -20 constant so that it will extend above
// the nav bar to the status bar.
gradientBlur.leftAnchor.constraint(equalTo: navBar.leftAnchor).isActive = true
gradientBlur.topAnchor.constraint(equalTo: navBar.topAnchor, constant: -20).isActive = true
gradientBlur.rightAnchor.constraint(equalTo: navBar.rightAnchor).isActive = true
gradientBlur.bottomAnchor.constraint(equalTo: navBar.bottomAnchor).isActive = true
}
下面是我的模拟器的结果图片。可以看到图片左上角有一些模糊的文字,其中状态栏的白色部分看起来更暗