UIStatusBarStyle PreferredStatusBarStyle không hoạt động trên iOS 7


110

Trong ứng dụng iPhone của tôi được xây dựng với Xcode 5 dành cho iOS 7 Tôi thiết lập UIViewControllerBasedStatusBarAppearance=YEStrong info.plist, và trong tôi ViewControllerTôi có mã này:

-(UIStatusBarStyle) preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Nhưng thanh trạng thái vẫn có màu đen trên nền đen.

Tôi biết có thể thay đổi ứng dụng này trên toàn bộ ứng dụng bằng cách cài đặt UIViewControllerBasedStatusBarAppearance=NOtrong info.plist, nhưng tôi thực sự cần phải thay đổi điều này một viewControllercách viewControllercơ bản trong thời gian chạy.


Xin chào, tôi có cùng một vấn đề như bạn đã đề cập trong câu hỏi. Bạn đã nhận được giải pháp? Vui lòng cung cấp cho tôi điều đó.
Noundla Sandeep

Câu trả lời:


281

Tôi phát hiện ra rằng nếu ViewController của bạn nằm bên trong một điều hướngController thì điều navigationBar.barStylehướngController sẽ xác định statusBarStyle.

Đặt navigationBar của bạn barStylethành UIBarStyleBlackTranslucentsẽ cung cấp văn bản trên thanh trạng thái màu trắng (tức là. UIStatusBarStyleLightContent) Và UIBarStyleDefaultsẽ cung cấp văn bản trên thanh trạng thái màu đen (tức là. UIStatusBarStyleDefault).

Lưu ý rằng điều này áp dụng ngay cả khi bạn thay đổi hoàn toàn màu của Thanh điều hướng thông qua nó barTintColor.


này có ý nghĩa với tôi ... tuyệt vời
Nick

14
Tôi tin rằng đó là bởi vì UINavigationControllerpreferredStatusBarStylekhông gọi thông qua các ViewController nó host, và thay vào đó chỉ trả về dựa trên navigationBarStyle của nó.
mxcl

Trong trường hợp này, chế độ xem không nằm trong bộ điều khiển điều hướng.
Andrew Smith

Rất khó hiểu khi nghĩ rằng kiểu thanh được ưu tiên hơn một phương thức được triển khai trong bộ điều khiển chế độ xem và chỉ khi trình bày các chế độ xem phương thức!
Matej

3
UIBarStyleBlackTranslucent bị phản đối, sử dụng UIBarStyleBlackthay vì
Nhơn Nguyễn

87

OK, đây là mẹo. Bạn phải thêm khóa "Xem thanh trạng thái dựa trên bộ điều khiển" và đặt giá trị thành Không.

Điều này trái ngược với ý nghĩa của phím này xuất hiện, nhưng ngay cả khi bạn đặt giá trị thành No, bạn vẫn có thể thay đổi giao diện của thanh trạng thái và cho dù nó có hiển thị hay không trong bất kỳ bộ điều khiển chế độ xem nào. Vì vậy, nó hoạt động giống như "Có" nhưng đặt nó thành "Không"!

Bây giờ tôi có thể nhận được thanh trạng thái màu trắng hoặc tối.


6
Đối với tôi điều này đã sai. Khóa cần được đặt thành "Có", như bạn mong đợi. Tôi đang sử dụng Xcode 5.1 iOS 7.1, vì vậy có thể nó đã bị thay đổi.
joel.d

Tôi cũng đang sử dụng Xcode 5.1 và iOS 7.1 và KHÔNG phù hợp với tôi ... STRANGE.
Arjun Mehta

Tôi nên thêm khóa này ở đâu?
Hadu

Trong tệp [AppName] -Info.plist của bạn
Saren Inden

1
Nó hoạt động tốt khi "Xem bộ điều khiển dựa trên thanh trạng thái" bộ chìa khóa để "YES" với Xcode6.0, iOS 8.0
bpolat

77

Để preferredStatusBarStyle()làm việc bên trong UINavigationControllerUITabBarControllertôi thêm mã sau, mã này sẽ nhận được kiểu thanh trạng thái ưa thích từ bộ điều khiển chế độ xem hiện đang hiển thị.

extension UITabBarController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return visibleViewController
    }
}

Đối với Swift 3, đó không phải là các phương thức mà là các thuộc tính:

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

Các thuộc tính Swift 4.2 đã được đổi tên:

extension UITabBarController {
   open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
   open override var childForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

Sử dụng

class ViewController: UIViewController {

    // This will be called every time the ViewController appears
    // Works great for pushing & popping
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}

6
Đây là đến nay là câu trả lời tốt nhất (Đối với ứng dụng sử dụng UINavigationController hoặc UITabBarController
Kesava

1
cách sử dụng cho cái này là gì?
AnBisw

@Annjawn các phương pháp này được UIKit sử dụng. Bạn không cần phải làm gì khác ngoài việc thêm nó vào dự án của mình.
Daniel Wood

@DanielWood vâng Tôi đã tìm ra điều đó và hoàn toàn quên rằng tôi đã sử dụng chính xác thứ này trong một trong những dự án trước đây của mình, mặc dù hơi khác một chút.
AnBisw

Đây thực sự là câu trả lời tốt nhất
Musa almatri

33

Tôi có thể đến đây hơi muộn, nhưng trong trường hợp bất kỳ ai khác đang tìm kiếm một giải pháp toàn ứng dụng hoạt động và được xác minh.

@mxcl đã đúng khi mô tả lý do tại sao điều này xảy ra. Để sửa lỗi, chúng tôi chỉ cần tạo một phần mở rộng (hoặc danh mục trong obj-c) ghi đè phương thức UINavigationController () được ưu tiên. Đây là một ví dụ trong Swift:

extension UINavigationController {
    public override func preferredStatusBarStyle() -> UIStatusBarStyle {
        if let rootViewController = self.viewControllers.first {
            return rootViewController.preferredStatusBarStyle()
        }
        return super.preferredStatusBarStyle()
    }
}

Đoạn mã này chỉ đơn giản là trích xuất bộ điều khiển chế độ xem đầu tiên (bộ điều khiển chế độ xem gốc) và mở nó ra (trong obj-c chỉ cần kiểm tra xem nó không phải là nil). Nếu việc mở thành công (không phải là nil) thì chúng ta lấy rootViewControllers favouriteStatusBarStyle. Nếu không, chúng tôi chỉ trả về mặc định.

Hy vọng điều này sẽ giúp bất cứ ai có thể cần nó.


2
Trong Swift 2.0 Bạn phải loại bỏ "as? UIViewController" của câu lệnh điều kiện.
Thomás Calmon

Thật tuyệt vời, tôi đã thực hiện một sửa đổi ngoài việc xóa câu lệnh "as", tôi đã thay đổi nó từ "đầu tiên" thành "cuối cùng" theo cách này, bất kỳ bộ điều khiển chế độ xem nào được người dùng ở đầu ngăn xếp sẽ có khả năng điều khiển màu sắc của thanh trạng thái. Công việc tuyệt vời, cảm ơn vì đã chia sẻ!
Unome

1
Nếu bộ điều khiển điều hướng của bạn không có bất kỳ bộ điều khiển chế độ xem nào, điều này sẽ gây ra một vòng lặp vô hạn. return self.preferredStatusBarStyle()sẽ gọi lại vào phương thức chính xác này.
bearMountain

1
Trong trường hợp của tôi, thay vì sử dụng rootViewController, tôi đã sử dụng topViewController vì trong ngăn xếp, kiểu có thể thay đổi.
Ric Santos

2
@Unome visibleViewControllersẽ còn tốt hơn
Cœur

21

Để cung cấp thêm chi tiết cho câu trả lời được chấp nhận, hãy đặt dòng sau trong didFinishLaunchingWithOptions:phương pháp của người đại diện ứng dụng của bạn :

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

Sau đó, trong Info.plist của bạn, hãy thêm View controller-based status bar appearancevà đặt nó thành NO.

Tôi tin rằng đó là cách nó nên được thực hiện, KHÔNG phải từ bộ điều khiển điều hướng, nếu bạn muốn cùng một màu thanh trạng thái cho toàn bộ ứng dụng. Bạn có thể có các màn hình không nhất thiết phải được nhúng vào một UINavigationControllerhoặc một UINavigationControllerlớp con khác ở một nơi khác và những thứ khác.

CHỈNH SỬA : Bạn cũng có thể làm điều đó mà không cần nhập bất kỳ mã nào: https://stackoverflow.com/a/18732865/855680


1
Lưu ý rằng cách này không được chấp nhận trên IOS 9.0
Mohamed Salah

10

Trong viewDidLoad chỉ cần viết cái này

[self setNeedsStatusBarAppearanceUpdate];

chỉ cần làm điều đó và nó sẽ hoạt động

bạn có thể vui lòng thử cái này không

Set UIViewControllerBasedStatusBarAppearance to NO.
Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Một điều nữa tôi đã thấy trong câu hỏi của bạn rằng bạn đã viết phương pháp như thế này

 -(void)UIStatusBarStyle PreferredStatusBarStyle ()
        {
            return UIStatusBarStyle.LightContent;
        }

nhưng nó phải như thế này

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

Điều này khiến phương thứcStatusBarStyle được ưu tiên được gọi, nhưng thanh trạng thái vẫn có màu đen.
Andrew Smith

xin vui lòng xem answer..let cập nhật của tôi cho tôi biết một cách nhanh chóng nếu đó công trình hay không
tài 1531343

Câu hỏi ban đầu của tôi nói rõ ràng rằng tôi cần thực hiện chế độ xem bằng chế độ xem của thanh trạng thái.
Andrew Smith,

bạn có thể vui lòng kiểm tra mã của bạn với tham chiếu đến câu hỏi đã cập nhật của tôi không?
Người dùng 1531343

1
[self setNeedsStatusBarAppearanceUpdate];một phương pháp tuyệt vời như vậy, cảm ơn bạn!
Supertecnoboff

6

Đây là cách tôi giải quyết nó. Thường thì navigationController hoặc tabBarController là những thứ quyết định sự xuất hiện của thanh trạng thái (ẩn, màu, v.v.).

Vì vậy, tôi đã kết thúc việc phân lớp con bộ điều khiển điều hướng và ghi đè ưu tiênStatusBarStyle. nếu ViewContorller hiển thị hiện tại triển khai StatusBarStyleHandler, tôi yêu cầu giá trị được sử dụng làm kiểu, nếu không, tôi chỉ trả về giá trị mặc định.

Cách bạn kích hoạt cập nhật giao diện thanh trạng thái là gọi lại setNeedsStatusBarAppearanceUpdatekích hoạt nào preferredStatusBarStylevà cập nhật giao diện người dùng theo những gì phương thức trả về

public protocol StatusBarStyleHandler {
    var preferredStatusBarStyle: UIStatusBarStyle { get }
}

public class CustomNavigationCotnroller: UINavigationController {

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        if let statusBarHandler = visibleViewController as? StatusBarStyleHandler {
            return statusBarHandler.preferredStatusBarStyle
        }

        return .default
    }
}

Sau đó, sử dụng

public class SomeController: UIViewController, StatusBarStyleHandler {

    private var statusBarToggle = true

    // just a sample for toggling the status bar style each time method is called
    private func toggleStatusBarColor() {
        statusBarToggle = !statusBarToggle
        setNeedsStatusBarAppearanceUpdate()
    }

    public override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarToggle ? .lightContent : .default
    }
}

Bài đăng này sẽ được cải thiện nhiều nếu bạn có thể giải thích tại sao và cách điều này khắc phục sự cố.

Thay vì phân lớp UINavigationController, bạn cũng có thể tạo một phần mở rộng cho UINavigationController và đạt được kết quả tương tự mà không cần phải phân lớp.
wilforeal

4

1) Một cài đặt cho toàn bộ dự án:

Nếu có, hãy xóa UIViewControllerBasedStatusBarAppearancecặp khóa-giá trị khỏi info.plist của bạn hoặc đặt NOmà không xóa. Nếu nó không có sẵn trong info.plist của bạn, không làm gì cả. Mặc định là NOcho thuộc tính này.

Thêm mã bên dưới vào AppDelegate.m của bạn:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

2) Các cài đặt khác nhau cho các Bộ điều khiển Chế độ xem khác nhau:

Thêm UIViewControllerBasedStatusBarAppearancecặp khóa-giá trị vào info.plist của bạn và đặt nó thành YES.

Nếu Bộ điều khiển Chế độ xem của bạn không được nhúng vào Bộ điều khiển Điều hướng. Giả sử MyViewController. chỉ cần thêm mã bên dưới vào tệp MyViewController.m của bạn. Nếu Bộ điều khiển Chế độ xem của bạn được nhúng vào Bộ điều khiển Điều hướng, hãy tạo Lớp cảm ứng Cocoa mới và đặt nó là lớp con của UINavigationController. Hãy nói MyNC. Chọn Chế độ xem Bộ điều khiển Điều hướng trên Bảng phân cảnh của bạn, ở ngăn bên phải; Tiện ích -> Trình kiểm tra danh tính -> Lớp tùy chỉnh -> Lớp, gõ "MyNC". Sau khi liên kết Chế độ xem bảng phân cảnh với Lớp cảm ứng ca cao "MyNC" của bạn, hãy thêm mã bên dưới vào MyNC.m của bạn:

- (BOOL)prefersStatusBarHidden {
    return NO;
}

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

Có vẻ như trong iOS9 UIViewControllerBasedStatusBarAppearance theo mặc định chứa giá trị CÓ, vì tôi cần thêm nó theo cách thủ công trong .plist và đặt thành KHÔNG để hoạt động bình thường.
Mohd Asim

4

Ngay cả với tất cả các câu trả lời ở đây, tôi vẫn không tìm ra giải pháp chính xác cho mình, nhưng bắt đầu với câu trả lời từ Daniel. Những gì tôi kết thúc với là:

override var preferredStatusBarStyle: UIStatusBarStyle {
     return visibleViewController?.preferredStatusBarStyle ?? .lightContent
}

trong bộ điều khiển điều hướng (tương tự cho tab, chỉ được chọnViewController). Và sau đó nó sẽ tôn trọng:

override var preferredStatusBarStyle: UIStatusBarStyle {
     return .lightContent
}

Trong mỗi bộ điều khiển chế độ xem trừ khi bạn đặt nó theo cách khác. Tôi không cần phải gọi ở setNeedsStatusBarAppearanceUpdate()bất cứ đâu, nó chỉ cập nhật khi bạn đến từng bộ điều khiển chế độ xem.


2
Tôi đã kết thúc với giải pháp gần như giống hệt nhau sau khi vật lộn với điều này trong nhiều giờ.
Scott Jungwirth

Tại một số điểm, điều này dường như đã được khắc phục, chỉ cần sử dụng favouriteStatusBarStyle trong mỗi VC hoạt động tốt cho tôi bây giờ.
Andrew Plummer

4

(Các) Giải pháp iOS 13

Câu trả lời được bình chọn cao nhất sử dụng mã "kế thừa" 👎

Việc đặt thuộc barStyletính hiện (iOS 13+) được coi là "tùy chỉnh kế thừa". Theo Apple ,

Trong iOS 13 trở lên, hãy tùy chỉnh thanh điều hướng của bạn bằng cách sử dụng các thuộc tính StandardAppearance, compactAppearance và scrollEdgeAppearance. Bạn có thể tiếp tục sử dụng các trình truy cập kế thừa này để tùy chỉnh trực tiếp giao diện của thanh điều hướng, nhưng bạn phải tự cập nhật giao diện cho các cấu hình thanh khác nhau.

Về nỗ lực của bạn - Bạn đã đi đúng hướng!

UINavigationControllerlà một lớp con của UIViewController(ai đã biết 🙃)!

Do đó, khi trình bày bộ điều khiển chế độ xem được nhúng trong bộ điều khiển điều hướng, bạn không thực sự trình bày bộ điều khiển chế độ xem được nhúng; bạn đang trình bày các bộ điều khiển điều hướng! UINavigationController, như là một lớp con của UIViewController, kế thừa preferredStatusBarStylechildForStatusBarStyle, bạn có thể đặt như mong muốn.

Bất kỳ phương pháp nào sau đây sẽ hoạt động:

  1. Ghi đè preferredStatusBarStylebên trongUINavigationController

    • preferredStatusBarStyle( doc ) - Kiểu thanh trạng thái ưa thích cho bộ điều khiển chế độ xem
    • Phân lớp hoặc mở rộng UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }

      HOẶC LÀ

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
  2. Ghi đè childForStatusBarStylebên trongUINavigationController

    • childForStatusBarStyle( doc ) - Được gọi khi hệ thống cần bộ điều khiển chế độ xem để sử dụng để xác định kiểu thanh trạng thái
    • Theo tài liệu của Apple,

      "Nếu bộ điều khiển chế độ xem vùng chứa của bạn lấy kiểu thanh trạng thái của nó từ một trong những bộ điều khiển chế độ xem con của nó, [ghi đè thuộc tính này] và trả lại bộ điều khiển chế độ xem con đó. Nếu bạn trả về nil hoặc không ghi đè phương thức này, kiểu thanh trạng thái cho chính nó sẽ được sử dụng . Nếu giá trị trả về từ phương thức này thay đổi, hãy gọi phương thức setNeedsStatusBarAppearanceUpdate (). "

    • Nói cách khác, nếu bạn không thực hiện giải pháp 3 ở đây, hệ thống sẽ quay trở lại giải pháp 2 ở trên.
    • Phân lớp hoặc mở rộng UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }

      HOẶC LÀ

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
    • Bạn có thể trả lại bất kỳ bộ điều khiển chế độ xem nào bạn muốn ở trên. Tôi đề xuất một trong những điều sau:

      • topViewController(of UINavigationController) ( doc ) - Bộ điều khiển chế độ xem ở đầu ngăn xếp điều hướng
      • visibleViewController(of UINavigationController) ( doc ) - Bộ điều khiển chế độ xem được liên kết với chế độ xem hiện đang hiển thị trong giao diện điều hướng (gợi ý: điều này có thể bao gồm "bộ điều khiển chế độ xem được trình bày theo phương thức trên đầu bộ điều khiển điều hướng")

Lưu ý: Nếu bạn quyết định phân lớp UINavigationController, hãy nhớ áp dụng lớp đó cho bộ điều khiển điều hướng của bạn thông qua trình kiểm tra danh tính trong IB.

PS Mã của tôi sử dụng cú pháp Swift 5.1 😎


1
Câu trả lời rất đầy đủ, cảm ơn! Ngoài ra, một điều mà tôi gặp khó khăn trong một thời gian, trên iOS 13, .defaultphong cách này sẽ xem xét chế độ tối và nó không được ghi lại, vì vậy nếu bạn cũng đang hỗ trợ các phiên bản iOS trước, bạn có thể thêm if #available(iOS 13, *) { return .darkContent } else { return .default }nếu bạn đang cố gắng thiết lập kiểu thanh trạng thái theo cách thủ công theo màu đằng sau thanh trạng thái và màu đó là "sáng".
valcanaia

1
Lưu ý rằng phương thức mở rộng thực hiện ghi đè var không hoạt động nữa trong Xcode 11.4 / iOS 13.4
Marc Etcheverry

Bởi vì việc mở rộng các lớp C mục tiêu trong Swift được thực hiện thông qua các hạng mục Mục tiêu C. Phương pháp ghi đè thông qua các danh mục Mục tiêu C không được khuyến khích và có khả năng bị hỏng. Xem stackoverflow.com/a/38274660/2438634
Marc Etcheverry

Mặc dù ghi đè UINavigationController chắc chắn hoạt động, nhưng có vẻ như một lỗi từ phía Apple khiến cho childForStatusBarStyle theo mặc định trả lại topViewController của nó. Ví dụ: UITabBarController thực hiện điều này cho các tab của nó. Đối với tôi, không có lý do gì UINavigationController, là một bộ điều khiển vùng chứa nghiêm ngặt để lưu trữ các bộ điều khiển Chế độ xem "thực" hơn là trình bày giao diện người dùng của riêng nó, lại "ăn" những kiểu thanh trạng thái đó. Sẽ tạo ra một radar cho Apple.
Igor Vasilev

1

Nếu trong trường hợp bạn muốn ẩn statusBar trong khi splashScreen nhưng muốn thay đổi kiểu thành nội dung nhẹ (StatusBarInitiallyHidden trên Plist phải KHÔNG để ẩn statusBar trên splash), bạn có thể thêm nó vào phương thức didFinishLaunchingWithOptions của appDelegate để thay đổi thành lightContent.

[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

1

ví dụ nhanh chóng

trong AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent;

    return true
}

trong info.plist set Xem giao diện thanh trạng thái dựa trên bộ điều khiển: KHÔNG


1

Nếu bạn đang sử dụng NavigationController, bạn có thể phân lớp NavigationControllerđể nó tham khảo bộ điều khiển chế độ xem con của nó

// MyCustomNavigationController

- (NSUInteger)supportedInterfaceOrientations {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk shouldAutorotate];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    UIViewController *viewControllerToAsk = [self findChildVC];
    return [viewControllerToAsk preferredStatusBarStyle];
}

- (UIViewController *)findChildVC {
    return self.viewControllers.firstObject;
}

1

Swift 4.2

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController
    }
}

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return visibleViewController
    }
}

Lưu ý rằng phương thức mở rộng thực hiện ghi đè var không hoạt động nữa trong Xcode 11.4 / iOS 13.4
Marc Etcheverry

@MarcEtcheverry vậy, tại sao bạn lại phản đối câu trả lời? Có vẻ lạ.
Vyacheslav

Bởi vì việc mở rộng các lớp C mục tiêu trong Swift được thực hiện thông qua các hạng mục Mục tiêu C. Phương pháp ghi đè thông qua các danh mục Mục tiêu C không được khuyến khích và có khả năng bị hỏng. Xem stackoverflow.com/a/38274660/2438634
Marc Etcheverry

@MarcEtcheverry 'không được khuyến khích'! = 'Không bao giờ sử dụng nó!'. cho jul2018 câu trả lời là chính xác. Ngay cả câu trả lời này không được cập nhật, đây không phải là lý do để từ chối nó. Tôi không thể nhìn thấy tương lai
Vyacheslav

0

Bạn có thể đặt kiểu thanh trạng thái. Nó sẽ giống với thanh trạng thái như IOS 6 trở xuống.
Dán các phương pháp này vào bộ điều khiển chế độ xem của bạn

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleBlackOpaque;
}

và gọi phương thức này từ chế độ xem đã tải như thế này

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
    {
       [self setNeedsStatusBarAppearanceUpdate];
    }

Bạn có nghĩa là [self setStatusBarNeedsUpdate]trong khối thứ hai? (Hoặc một cái gì đó khác ít nhất).
mxcl.

0

Tôi chỉ muốn thêm một ghi chú cho một trường hợp cụ thể mà tôi đã đối mặt. Tôi đã có một UIWindow khác trong ứng dụng của mình để hiển thị khuôn mặt trò chuyện luôn nổi trên ứng dụng của tôi. Làm điều này khiến không giải pháp nào ở trên hoạt động và tôi không thực sự chắc chắn tại sao! Tất cả những gì tôi nhận thấy là ViewController của tôi trong UIWindow mới là lý do cho điều đó! Và nếu tôi muốn thay đổi kiểu thanh trạng thái, tôi phải thực hiện điều đó trong bộ điều khiển chế độ xem của UIWindow mới.

Ghi chú này có thể giúp ích cho những người có cấu trúc tương tự! Vì vậy, về cơ bản bạn có thể áp dụng các giải pháp được đề cập ở trên trong ViewController của UIWindow mới.

Một lần nữa đây là một trường hợp cụ thể.

Cảm ơn


-1

Đối với swift 3, trong UIViewController của bạn:

override var preferredStatusBarStyle : UIStatusBarStyle { return UIStatusBarStyle.lightContent }
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.