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

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