Xcode 11.4. Màu tiêu đề của điều hướng chuyển sang màu đen từ bảng phân cảnh


55

Gần đây tôi đã cập nhật Xcode của mình lên 11.4. Khi tôi chạy ứng dụng trên thiết bị, tôi đã nhận thấy rằng tất cả các tiêu đề của mục điều hướng của tôi hoàn toàn tối đen khi được đặt từ bảng phân cảnh. nhập mô tả hình ảnh ở đây

Bạn không thể thay đổi từ mã, dòng mã sau không hoạt động nữa

self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]

Tôi chỉ làm cho nó hoạt động bằng cách sử dụng một số nội dung trên iOS 13 UINavestionBarAppparent

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

Ai đó có thể giải thích cho tôi tại sao ??? Đây là một lỗi nghiêm trọng, hoặc một số tính năng ẩn mới?


3
Vấn đề tương tự ở đây và tôi không tìm thấy gì để làm điều này. Tôi nghĩ đó là một lỗi: /
Jordan Favray

Táo. Xấu Có thật không?
Daniel


đó là Trình xây dựng giao diện Xcode Bug Update XCode lên 11.4.1
NinjaDeveloper

Câu trả lời:



36

Điều này đã sửa nó cho tôi, bằng cách sử dụng UINavlationBarAppparent, từ: Tùy chỉnh thanh điều hướng của ứng dụng của bạn

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

Lưu ý: Tôi đã phân lớp UINavlationControll và điều này được gọi từ ghi đè của viewWillAppear .

... Hoặc cho AppDelegate , toàn ứng dụng:

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
}

... cho AppDelegate, toàn ứng dụng, trong Objective-C:

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

Cảm ơn bạn, đây là một câu trả lời chính xác! , trên iOS 13 Apple đã thêm UINavigationBarAppearance()và không có lý do gì đối với Xcode cũ, chúng tôi không cần phải phụ thuộc vào nó, nhưng vì Xcode 11.4 nên nó phải sử dụng UINavigationBarAppearance()hoặc màu Tiêu đề sẽ luôn là màu Đen.
Basil

appearance.largeTitleTextAttributescho các danh hiệu lớn.
Skoua

Điều này hoạt động rất tốt và cảm ơn bạn!, Có cách nào để thực hiện việc này từ AppDelegate không?
thái thịt

@slicerdicer - Đúng! Xem câu trả lời cập nhật của tôi, ví dụ. Chúc mừng.
Stu Carney

1
@Richard - Tôi vừa thêm câu trả lời cho Objective-C. Xin lỗi, tôi đã không thấy bình luận của bạn cho đến ngày hôm nay.
Stu Carney

14

Trên bảng phân cảnh, đối với Bộ điều khiển Điều hướng của bạn thay đổi giá trị "Thanh màu" thành giá trị "Mặc định", sau đó trên mã của bạn, bạn có thể thay đổi nó như bình thường.


3
Câu trả lời tốt nhất. Có thật không.
Vladimir Prigarin

2
Đây là cách thích hợp
Hugo

1
Thời kỳ anwer❗️ tốt nhất.
Shadowheep

2
@ JCocking8 yup, đúng vậy. Nhưng với Xcode 11.4 nếu bạn không đặt màu mặc định trong bảng phân cảnh, việc thay đổi nó theo lập trình thì nó không hoạt động. Tôi không biết đây có phải là vấn đề hay không.
Shadowheep

1
Đây là một phép thuật!
ekashking

6

Không chắc đó có phải là lỗi hay không.

Cách chúng tôi sửa nó là bằng cách đặt "Kiểu thanh trạng thái" thành nội dung tối hoặc sáng trong cài đặt dự án. Điều này sẽ buộc màu văn bản Thanh trạng thái theo một cách nhất định thay vì được xác định dựa trên các thiết bị ở chế độ Sáng hoặc Tối.

Ngoài ra, bạn cần đặt giá trị "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" thành "KHÔNG" trong Info.plist của bạn. không có giá trị đó, "Kiểu thanh trạng thái" sẽ bị ghi đè.

Tiếp theo tạo một bộ điều khiển điều hướng tùy chỉnh và thực hiện nó trong bảng phân cảnh của bạn.

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

* Màu sắc được đặt để bạn có thể thấy chúng hoạt động rõ ràng.

Tôi thấy tốt hơn là đặt mã trong ViewDidLoad thay vì ViewDidAppear vì màu của tôi không được đặt trên tải ban đầu, chỉ sau khi điều hướng trở lại và tải lại.

Tôi cũng thấy rằng vấn đề này có thể được gắn với "Bar Tint" của NavBar. Khi chúng tôi lần đầu tiên cố gắng giải quyết nó, chúng tôi đã đặt "Bar Tint" thành mặc định và điều đó dường như cũng giải quyết lỗi. Tuy nhiên, nó đã làm cho nó vì vậy chúng tôi không thể có được màu nền NavBar như những gì chúng tôi muốn. Vì vậy, trong bảng phân cảnh của mình, tôi đã đảm bảo đặt giá trị này thành mặc định chỉ là biện pháp tốt.

Hy vọng nó giúp


Điều này không hoạt động. Có vẻ như nó chỉ thiết lập phong cách toàn cầu không hoạt động.
Mongo

def một lỗi vào cuối táo. không thể giúp phá vỡ mọi thứ>. <
Michael McKenna

2

không cần giải pháp.it là một lỗi trong Xcode Interface Builder. Apple phát hành Cập nhật cho Xcode 11.4.1

từ ghi chú phát hành của nhà phát triển Apple

Trình tạo giao diện

Đã khắc phục sự cố khiến một số thuộc tính xuất hiện của UINavestionBar được đặt trong bảng phân cảnh và tài liệu XIB bị bỏ qua khi xây dựng với Xcode 11.4. (60883063) (FB7639654)

https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes


0

Tương tự như phản hồi của Stu Carney vào ngày 25/3, tôi đã thêm một vài chi tiết thực hiện.

Tạo một lớp con của UINavestionControll . Thêm phần sau vào viewWillAppear:

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

Sau đó, ghi đè ưa thíchStatusBarStyle :

override var preferredStatusBarStyle: UIStatusBarStyle {
    let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
    return isDarkMode ? .lightContent : .default
}

Nếu bạn muốn cập nhật thanh điều hướng và thanh trạng thái một cách linh hoạt, như từ phương pháp UBAwitch IBAction hoặc bộ chọn, hãy thêm vào như sau:

navigationController?.loadView()
navigationController?.topViewController?.setNeedsStatusBarAppearanceUpdate()

Ngoài ra, hãy đảm bảo đặt tất cả các thanh điều hướng và nút thanh của bạn thành màu mặc định trong IB. Xcode dường như có một lỗi trong đó các màu IB ghi đè lên các màu được đặt theo chương trình.


0

Trong trường hợp của tôi, sau khi tôi nâng cấp Xcode từ 11.3 lên 11.4, lỗi này đã xảy ra. Vì vậy, tôi phải thay đổi mã của mình để thổi để đặt hình ảnh làm nền trong thanh điều hướng.

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()
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.