我有UIkit一个项目,我想更改导航栏颜色和后退按钮颜色。它在以前的版本上工作正常。但在 iOS 15 中则不然。我在上面添加了以下代码AppDelegate,它更改了标题颜色但不更改后退按钮项目颜色。如何修复它?
if #available(iOS 15.0, *) {
let appearance = UINavigationBarAppearance()
let navigationBar = UINavigationBar()
appearance.configureWithOpaqueBackground()
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
appearance.backgroundColor = .red
navigationBar.tintColor = .white
navigationBar.standardAppearance = appearance;
UINavigationBar.appearance().scrollEdgeAppearance = appearance
}else{
let navBarAppearnce = UINavigationBar.appearance()
navBarAppearnce.tintColor = .white
navBarAppearnce.barTintColor = .red
navBarAppearnce.titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white]
}
Run Code Online (Sandbox Code Playgroud)
在ios 13中,Apple引入了新的UINavigationBarAppearance代理对象来设置导航栏外观。除了一件小事情,我几乎可以设置所有我需要的东西。后退按钮的箭头始终显示为蓝色,我不知道如何将其设置为所需的颜色。我使用的是旧[[UINavigationBar appearance] setTintColor:]方法,但是我认为必须使用UINavigationBarAppearance对象API来实现。有人知道如何吗?
我有一个超级简单的 SwiftUI 主从应用程序:
import SwiftUI
struct ContentView: View {
@State private var imageNames = [String]()
var body: some View {
NavigationView {
MasterView(imageNames: $imageNames)
.navigationBarTitle(Text("Master"))
.navigationBarItems(
leading: EditButton(),
trailing: Button(
action: {
withAnimation {
// simplified for example
self.imageNames.insert("image", at: 0)
}
}
) {
Image(systemName: "plus")
}
)
}
}
}
struct MasterView: View {
@Binding var imageNames: [String]
var body: some View {
List {
ForEach(imageNames, id: \.self) { imageName in
NavigationLink(
destination: DetailView(selectedImageName: imageName)
) {
Text(imageName) …Run Code Online (Sandbox Code Playgroud) 在 iOS 15 上,当导航到具有透明导航栏的视图控制器时,透明栏的动画无法按预期工作。
但是,如果您导航回带有透明导航栏的视图控制器,动画将按预期工作。
这就是我设置视图控制器的方式:
根VC
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = UIColor.red
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance
Run Code Online (Sandbox Code Playgroud)
第一VC
let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance
Run Code Online (Sandbox Code Playgroud)
第二VC
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = UIColor.yellow
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance
Run Code Online (Sandbox Code Playgroud)
请注意以下示例中从secondaryVC -> firstVC的过渡是多么平滑,但不是从rootVC -> firstVC的过渡:
示例项目: https: //github.com/karlingen/NavigationTest
有什么想法为什么会这样吗?
uinavigationbar uinavigationcontroller ios uinavigationbarappearance ios15
我想根据屏幕内容更改状态栏样式。对于较暗的屏幕,状态栏内容应为白色。对于较浅的屏幕,状态栏内容应为黑色。
看来该问题仅发生在 iOS 15 设备上。
下面的屏幕截图比较了 iOS 15.2 和 iOS 14.5 上的相同用例
正如您所看到的,即使导航栏样式设置为“黑色”,状态栏样式也是默认的
class ViewAController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// setup views ...
}
// setting navigation bar style doesn't work iOS 15. Needed to set UINavigationAppearance()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.barTintColor = .white
self.navigationController?.navigationBar.barStyle = .default
self.navigationController?.navigationBar.titleTextAttributes = [.font: UIFont.boldSystemFont(ofSize: 18), .foregroundColor: UIColor.black]
if #available(iOS 15, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = .white
appearance.shadowImage = UIImage()
appearance.shadowColor = .clear
appearance.titleTextAttributes …Run Code Online (Sandbox Code Playgroud) uikit uinavigationcontroller swift uinavigationbarappearance ios15
我试图Title在 a 中显示一个大的Navigation bar,但背景清晰。向上滚动时,它将Navigation bar具有模糊效果。
这看起来是正确的,但是,在滚动时,动画似乎被破坏了。此外,过渡有时会卡住:
我的代码如下:
UINavigationController:
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 13.0, *) {
self.navigationBar.prefersLargeTitles = true
let style = UINavigationBarAppearance()
style.configureWithDefaultBackground()
style.titleTextAttributes = [.font: UIFont.systemFont(ofSize: 18)]
self.navigationBar.standardAppearance = style
self.navigationBar.compactAppearance = style
//Configure Large Style
let largeStyle = UINavigationBarAppearance()
largeStyle.configureWithTransparentBackground()
largeStyle.largeTitleTextAttributes = [.font: UIFont.systemFont(ofSize: 28)]
self.navigationBar.scrollEdgeAppearance = largeStyle
}
}
Run Code Online (Sandbox Code Playgroud)
该UITableView是内部的UINavigationController。两者都是通过 segue 方式从故事板中提取的。
我正在尝试更改NavigationBarSwiftUI 中的背景颜色,这是我使用以下代码完成的。但是,我还没有弄清楚如何动态更改和更新导航栏的背景颜色。
struct ContentView: View {
@State var color: Color = .red
init() {
let navbarAppearance = UINavigationBarAppearance()
navbarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
navbarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
navbarAppearance.backgroundColor = UIColor(color)
UINavigationBar.appearance().standardAppearance = navbarAppearance
UINavigationBar.appearance().compactAppearance = navbarAppearance
UINavigationBar.appearance().scrollEdgeAppearance = navbarAppearance
}
var body: some View {
NavigationView {
VStack(spacing: 20) {
Button(action: { color = .blue }) {
Text("Blue")
.font(.title)
.bold()
.foregroundColor(.white)
.frame(width: 100)
.padding()
.background(Color.blue)
.cornerRadius(15)
}
Button(action: { color = .red }) {
Text("Red")
.font(.title)
.bold()
.foregroundColor(.white)
.frame(width: …Run Code Online (Sandbox Code Playgroud) uinavigationbar swift swiftui uinavigationbarappearance swiftui-navigationview
我的应用程序在 iOS 15 和 14 上运行良好,也许在 13 上也运行良好。但是,当我在使用 iOS 12 的旧设备上运行时,即使在触发 didFinishLaunchingWithOptions 之前,它也会在启动时崩溃。上次我使用 Xcode 12 构建时运行良好。
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named UINavigationBarAppearance because no class named UINavigationBarAppearance was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)' terminating with uncaught exception of type NSException
我正在更新一个在 Xcode 10 上编译并在 iOS 13 上正常运行的应用程序。我想进行一些更改,因此在 Xcode 11 上重新编译,但现在 barTintColor 出现问题。
如果“大标题”设置为“始终”,则不会应用我的自定义 barTintColor - 我只会获得默认的灰色。如果“大标题”设置为“从不”,我的自定义 barTintColor 将按预期应用。如果“大标题”设置为“自动”,则显示大标题时导航栏默认为灰色,显示小标题时导航栏为我的自定义颜色。例如,当我的导航栏下方的TableView被向上推时,默认的大标题切换为小标题,并且我的导航栏改变颜色。正常行为是它始终是我的自定义颜色。
我的 ViewController 类中的相关代码,最后一行是设置 barTintColor 的代码:
override func viewDidLoad() {
super.viewDidLoad()
setDelegates()
setTableViewHeightForCollapsingHeaders()
setNavigtionBarItems()
doSplitViewManagement()
}
override func viewWillAppear(_ animated: Bool) {
clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed
super.viewWillAppear(animated)
updateUI()
}
fileprivate func setNavigtionBarItems() {
//set up UI buttons
navigationItem.leftBarButtonItem = editButtonItem
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))
navigationItem.rightBarButtonItem = addButton
navigationController?.navigationBar.barTintColor = UIColor(hex: 0x5da0a2)
}
Run Code Online (Sandbox Code Playgroud)
知道行为发生变化的原因以及如何解决吗?
你如何使用这个新对象来自定义 iOS 13 中的导航栏?我在 Objective-C 中尝试了以下代码,但无法正常工作。它仅在视图控制器被推送或弹出到导航堆栈时显示我的标题文本属性。
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.titleTextAttributes = @{NSFontAttributeName: font};
Run Code Online (Sandbox Code Playgroud)
这是此对象的文档。 https://developer.apple.com/documentation/uikit/uinavigationbarappearance?language=objc