Xcode 11.4. 스토리 보드에서 탐색의 제목 색상이 검은 색으로 바 gone


55

최근에 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]
    }

누군가 왜 나에게 설명 할 수 있습니까 ??? 이것은 중대한 버그입니까, 아니면 새로운 숨겨진 기능입니까?


3
여기에 동일한 문제가 있으며이 문제를 해결하기 위해 할 일이 없습니다. 나는 그것이 버그라고 생각한다 : /
Jordan Favray

사과. 어이. 정말?
다니엘

이 하나를 사용해보십시오 stackoverflow.com/a/61003557/3887987
Amrit Tiwari

Xcode 인터페이스 빌더 버그 업데이트 XCode를 11.4.1로
NinjaDeveloper

답변:



36

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];
}

감사합니다, 이것이 정답입니다! , iOS 13에 Apple이 추가 UINavigationBarAppearance()되었으며 이전 Xcode에서 아무런 이유없이 우리는 그것에 의존 할 필요가 없었지만 Xcode 11.4부터 사용해야 UINavigationBarAppearance()하거나 제목 색상은 항상 검은 색입니다.
바질

appearance.largeTitleTextAttributes큰 제목의 경우
Skoua

이것은 훌륭하게 작동하고 감사합니다!, AppDelegate에서 보편적으로 이것을 할 수 있습니까?
슬라이서

@slicerdicer-p! 예를 들어 업데이트 된 답변을 참조하십시오. 건배.
Stu Carney

1
@Richard-방금 Objective-C에 대한 답변을 추가했습니다. 죄송합니다. 오늘까지 귀하의 의견을 보지 못했습니다.
Stu Carney

14

스토리 보드에서 Navigation Controller의 "Bar Tint"를 "Default"값으로 변경 한 다음 코드에서 평소처럼 변경할 수 있습니다.


3
가장 좋은 답변입니다. 정말.
블라디미르 프리 가린

2
이것이 올바른 방법입니다
휴고

1
최고의 anwer❗️ 기간.
shadowsheep

2
@ JCutting8 yup, 맞습니다. 그러나 Xcode 11.4를 사용하면 스토리 보드에서 기본 색상을 설정하지 않으면 프로그래밍 방식으로 변경해도 작동하지 않습니다. 이것이 문제인지 아닌지 모르겠습니다.
shadowsheep

1
이것은 마술이다!
ekashking

6

버그인지 확실하지 않습니다.

우리가 해결 한 방법은 프로젝트 설정에서 "상태 표시 줄 스타일"을 어둡거나 밝은 내용으로 설정하는 것입니다. 이렇게하면 밝게 또는 어둡게 모드 인 장치에 따라 결정되지 않고 상태 표시 줄의 텍스트 색상이 특정 방식으로 표시됩니다.

또한 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 배경색을 원하는대로 얻을 수 없었습니다. 따라서 스토리 보드 에서이 값을 기본값으로 설정하여 제대로 측정했습니다.

그것이 도움이되기를 바랍니다.


이것은 작동합니다. 작동하지 않는 전역 스타일을 설정하는 것처럼 보입니다.
몽고

사과의 끝에 버그를 방어. >. <
Michael McKenna


0

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 색상이 프로그래밍 방식으로 설정된 색상보다 우선하는 버그가있는 것 같습니다.


0

필자의 경우 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()
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.