최근에 Xcode를 11.4로 업데이트했습니다. 기기에서 앱을 실행하면 스토리 보드에서 설정했을 때 모든 내비게이션 항목의 제목이 완전히 검은 색으로 바뀌는 것을 알았습니다.
코드를 변경할 수 없으며 다음 코드 줄이 더 이상 작동하지 않습니다.
self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
iOS 13을 사용하는 경우에만 작동합니다.
@available(iOS 13.0, *)
private func setupNavigationBar() {
let app = UINavigationBarAppearance()
app.titleTextAttributes = [.foregroundColor: UIColor.white]
app.backgroundColor = Constants.Color.barColor
self.navigationController?.navigationBar.compactAppearance = app
self.navigationController?.navigationBar.standardAppearance = app
self.navigationController?.navigationBar.scrollEdgeAppearance = app
self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}
누군가 왜 나에게 설명 할 수 있습니까 ??? 이것은 중대한 버그입니까, 아니면 새로운 숨겨진 기능입니까?
답변
Apple은 마침내 버전 11.4.1에서 수정했습니다.
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes
답변
UINavigationBarAppearance를 대신 사용하여 다음을 해결했습니다. 앱의 탐색 모음 사용자 정의
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UIColor.black
appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // With a red background, make the title more readable.
self.navigationBar.standardAppearance = appearance
self.navigationBar.scrollEdgeAppearance = appearance
self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.
} else {
self.navigationBar.barTintColor = UIColor.black
self.navigationBar.tintColor = UIColor.white
self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}
참고 : UINavigationController 서브 클래스 화 되었으며 viewWillAppear 의 재정의에서 호출되었습니다 .
… 또는 앱 전체의 AppDelegate :
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UIColor.black
appearance.titleTextAttributes = [
NSAttributedStringKey.foregroundColor: UIColor.white
]
let buttonAppearance = UIBarButtonItemAppearance()
buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.white]
appearance.buttonAppearance = buttonAppearance
UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
UINavigationBar.appearance().compactAppearance = appearance
UIBarButtonItem.appearance().tintColor = UIColor.white
} else {
UINavigationBar.appearance().barTintColor = UIColor.black
UINavigationBar.appearance().titleTextAttributes = [
NSAttributedStringKey.foregroundColor: UIColor.white
]
UINavigationBar.appearance().tintColor = UIColor.white
UIBarButtonItem.appearance().tintColor = UIColor.white
}
… Objective-C에서 앱 전체의 AppDelegate :
if (@available(iOS 13, *)) {
UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
[appearance configureWithOpaqueBackground];
appearance.backgroundColor = UIColor.whiteColor;
appearance.titleTextAttributes = titleAttributes;
UIBarButtonItemAppearance *buttonAppearance = [[UIBarButtonItemAppearance alloc] init];
buttonAppearance.normal.titleTextAttributes = barButtonItemAttributes;
appearance.buttonAppearance = buttonAppearance;
UINavigationBar.appearance.standardAppearance = appearance;
UINavigationBar.appearance.scrollEdgeAppearance = appearance;
UINavigationBar.appearance.compactAppearance = appearance;
[[UINavigationBar appearance] setTintColor:UIColor.blackColor];
} else {
[[UINavigationBar appearance] setBarTintColor:UIColor.whiteColor];
[[UINavigationBar appearance] setTintColor:UIColor.blackColor];
[[UINavigationBar appearance] setTranslucent:false];
[[UINavigationBar appearance] setTitleTextAttributes: titleAttributes];
[[UIBarButtonItem appearance] setTitleTextAttributes:barButtonItemAttributes forState:UIControlStateNormal];
}
답변
스토리 보드에서 Navigation Controller의 “Bar Tint”를 “Default”값으로 변경 한 다음 코드에서 평소처럼 변경할 수 있습니다.
답변
버그인지 확실하지 않습니다.
우리가 해결 한 방법은 프로젝트 설정에서 “상태 표시 줄 스타일”을 어둡거나 밝은 내용으로 설정하는 것입니다. 이렇게하면 밝게 또는 어둡게 모드 인 장치에 따라 결정되지 않고 상태 표시 줄의 텍스트 색상이 특정 방식으로 표시됩니다.
또한 Info.plist에서 “컨트롤러 기반 상태 표시 줄보기”값을 “NO”로 설정해야합니다. 이 값이 없으면 “상태 표시 줄 스타일”이 재정의됩니다.
그런 다음 사용자 정의 내비게이션 컨트롤러를 만들어 스토리 보드에 구현하십시오.
class CustomNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
setNavBar()
}
func setNavBar() {
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UIColor.blue
appearance.titleTextAttributes = [.foregroundColor: UIColor.yellow]
self.navigationBar.standardAppearance = appearance
self.navigationBar.scrollEdgeAppearance = appearance
self.navigationBar.compactAppearance = appearance
} else {
self.navigationBar.barTintColor = UIColor.blue
self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.yellow]
}
}
}
* 색상이 선명하게 작동하도록 설정되었습니다.
내 색상이 초기로드에서 설정되지 않았기 때문에 다시 탐색하고 다시로드 한 후에 만 ViewDidAppear 대신 ViewDidLoad에서 코드를 설정하는 것이 좋습니다.
또한이 문제는 NavBar의 “Bar Tint”와 관련이있을 수 있습니다. 처음 해결하려고 할 때 “Bar Tint”를 기본값으로 설정했는데 오류도 해결 된 것 같습니다. 그러나 NavBar 배경색을 원하는대로 얻을 수 없었습니다. 따라서 스토리 보드 에서이 값을 기본값으로 설정하여 제대로 측정했습니다.
그것이 도움이되기를 바랍니다.
답변
해결 방법이 필요하지 않습니다. Xcode Interface Builder의 버그입니다. Xcode 11.4.1 용 Apple 릴리스 업데이트
Apple 개발자 릴리스 정보
인터페이스 빌더
Xcode 11.4로 빌드 할 때 스토리 보드 및 XIB 문서에 설정된 일부 UINavigationBar 모양 속성이 무시되는 문제를 수정했습니다. (60883063) (FB7639654)
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes
답변
3/25에 대한 Stu Carney의 답변과 유사하게 몇 가지 구현 세부 정보를 추가했습니다.
UINavigationController 의 서브 클래스를 작성하십시오 . 다음을 추가하여 WillAppear를보십시오.
let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
let titleColor: UIColor = isDarkMode ? .white : .black
let navBarColor: UIColor = isDarkMode ? .black : .white
let tintColor: UIColor = isDarkMode ? .yellow : .red //back button text and arrow color, as well as right bar button item
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = navBarColor
appearance.titleTextAttributes = [.foregroundColor: titleColor]
appearance.largeTitleTextAttributes = [.foregroundColor: titleColor]
self.navigationBar.standardAppearance = appearance
self.navigationBar.scrollEdgeAppearance = appearance
self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.
self.navigationBar.tintColor = tintColor //changes back button text and arrow color, as well as right bar button item
} else {
self.navigationBar.barTintColor = navBarColor
self.navigationBar.tintColor = tintColor
self.navigationBar.titleTextAttributes = [.foregroundColor: titleColor]
self.navigationBar.largeTitleTextAttributes = [.foregroundColor: titleColor]
}
그런 다음 preferredStatusBarStyle을 재정의하십시오 .
override var preferredStatusBarStyle: UIStatusBarStyle {
let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
return isDarkMode ? .lightContent : .default
}
UISwitch IBAction 또는 선택기 방법과 같이 탐색 모음 및 상태 표시 줄을 동적으로 업데이트하려면 다음을 추가하십시오.
navigationController?.loadView()
navigationController?.topViewController?.setNeedsStatusBarAppearanceUpdate()
또한 모든 탐색 막대 및 막대 버튼을 IB의 기본 색상으로 설정해야합니다. Xcode는 IB 색상이 프로그래밍 방식으로 설정된 색상보다 우선하는 버그가있는 것 같습니다.
답변
필자의 경우 Xcode를 11.3에서 11.4로 업그레이드 한 후이 버그가 발생했습니다. 따라서 탐색 모음에서 이미지를 배경으로 설정하려면 코드를 날려야합니다.
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
appearance.backgroundImage = backgroundImage
self.navigationController?.navigationBar.compactAppearance = appearance
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
} else {
self.navigationController?.navigationBar.barTintColor = Utils.themeColor
let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
self.navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
}