2017-06-18 33 views
8

Tôi có yêu cầu trong đó tôi phải sử dụng UINavigationBar với tiêu đề lớn màu đỏ.Thay đổi màu văn bản của tiêu đề thanh điều hướng khi "prefersLargeTitles" được đặt thành true

Hiện nay, tôi có đoạn mã sau:

func prepareNavigationController() { 
    let navController = UINavigationController(rootViewController: self) 
    navController.navigationBar.prefersLargeTitles = true 
    navigationItem.searchController = UISearchController(searchResultsController: nil) 
    navigationItem.hidesSearchBarWhenScrolling = false 
    navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.red] 
} 

Nhưng nó không thực sự tinting nhãn tiêu đề sang màu đỏ. Đây là kết quả:

Ignored title color

Nhưng thay đổi prefersLargeTitles false làm điều đúng, và tiêu đề của tôi là màu đỏ.

navController.navigationBar.prefersLargeTitles = false

Tinted Title

Tôi không hoàn toàn chắc chắn nếu điều này là một lỗi kể từ thời điểm viết bài này, chúng tôi vẫn đang trong phiên bản beta đầu tiên, hoặc nếu đây là hành vi cố ý, chủ yếu là bởi vì tôi thiên đường không có ứng dụng nào của Apple tô màu các tựa game lớn trước đây. Có cách nào để thực sự có được danh hiệu lớn để có bất kỳ màu nào tôi muốn?

+0

tôi đang tìm kiếm điều tương tự! Và tôi đã không tìm ra cách thay đổi nó, có lẽ vì đây là phiên bản beta đầu tiên mà Apple chưa triển khai. – Philippe

+0

Có lẽ đây có thể là câu trả lời đúng https://stackoverflow.com/a/46007201/7048642 –

Trả lời

13

Có một tài sản UINavigationBar mới "largeTitleTextAttribute" mà nên giúp đỡ với điều này.

largeTitleTextAttribute

Đây là một mã số mẫu mà bạn có thể thêm vào bộ điều khiển xem của bạn viewDidLoad phương pháp

 navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue] 

enter image description here

Dưới đây là một số mẫu mã và ảnh chụp màn hình mà không cần tập largeTitleTextAttributes, nhưng barStyle được đặt thành .black

 navigationController?.navigationBar.barStyle = .black 

enter image description here

Đây là một ảnh chụp màn hình mà không cần tập largeTitleTextAttributes, nhưng barStyle được thiết lập để .DEFAULT

 navigationController?.navigationBar.barStyle = .default 

enter image description here

+0

Thú vị. Đây có phải là bản mới cho bản Beta 3 không? Tôi chưa tải xuống nhưng tôi sẽ làm như vậy ngay bây giờ và kiểm tra. –

+0

Có phiên bản beta mới 3. Hoặc ít nhất tôi mới nhận thấy nó bây giờ. – assb10yr

+0

Tôi sẽ xác nhận trong vài giờ (internet chậm), vì biểu tượng không tồn tại trên Beta 2. –

2

Không chắc chắn nếu đó là lỗi trong bản beta 1 & 2, nhưng đây là một cách để đặt màu. Đó là một chút của một "hacky" workaround, nhưng nó sẽ làm việc cho đến khi Apple sửa lỗi này. Trong cả hai phiên bản Objective-C và Swift, mã này đi theo phương thức viewDidAppear:.

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{ 
    for (UIView *view in self.navigationController.navigationBar.subviews) { 
     NSArray <__kindof UIView *> *subviews = view.subviews; 
     if (subviews.count > 0) { 
      UILabel *label = subviews[0]; 
      if (label.class == [UILabel class]) { 
       [label setTextColor:[UIColor redColor]]; 
      } 
     } 
    } 
}); 

Swift:

DispatchQueue.main.async { 
    for view in self.navigationController?.navigationBar.subviews ?? [] { 
    let subviews = view.subviews 
    if subviews.count > 0, let label = subviews[0] as? UILabel { 
      label.textColor = UIColor.red 
} } } 
0

Dưới đây là đoạn code làm việc để sử dụng danh hiệu lớn và thiết lập màu sắc văn bản của tiêu đề lớn và nhỏ màu trắng, cả trên iOS11 + và trên các phiên bản iOS cũ hơn.

// Will apply to versions before iOS 11 
navigationController?.navigationBar.titleTextAttributes = [ 
    NSAttributedStringKey.foregroundColor: UIColor.white 
] 

if #available(iOS 11.0, *) { 
    navigationController?.navigationBar.prefersLargeTitles = true 
    navigationController?.navigationBar.largeTitleTextAttributes = [ 
     NSAttributedStringKey.foregroundColor: UIColor.white 
    ] 
} 

(Đã từng có một lỗi trong Xcode, nhưng nó bây giờ xuất hiện để được cố định)

Các vấn đề liên quan