2012-10-07 30 views
9

Tôi đã đăng ký nhận thông báo về các thay đổi của khung thanh trạng thái, nhưng chúng chưa bao giờ nhận được.Thay đổi khung thanh trạng thái mà không cần bất kỳ thông báo nào

Dưới đây là làm thế nào tôi đăng ký tham gia thông báo:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(appWillChangeStatusBarFrameNotification:) 
              name:UIApplicationWillChangeStatusBarFrameNotification 
              object:nil]; 

Ở một số nơi trong ứng dụng của chúng tôi, chúng tôi hiển thị/ẩn thanh trạng thái với:

[[UIApplication sharedApplication] setStatusBarHidden:maximize 
             withAnimation:UIStatusBarAnimationSlide]; 

Nhưng nó cũng có thể thay đổi kích thước khi điểm phát sóng cá nhân được bật hoặc khi có cuộc gọi điện thoại. Có cách nào để có được khung thanh trạng thái thực tế khi nó thay đổi không?

This question ngụ ý rằng thông báo không hoạt động do lỗi SDK, ít nhất là cho các thay đổi định hướng. Đó có phải là lý do? Có bất kỳ công việc xung quanh?

+0

Hmmm ... hoạt động cho tôi về các thay đổi định hướng nhưng không phải với setStatusBarHidden. Tôi nhận được nó được gọi là khi tôi mô phỏng một cuộc gọi điện thoại trên giả lập. – rdelmar

Trả lời

6

Tôi biết câu hỏi này đã được đăng trong khi trở lại, nhưng vấn đề này là một vấn đề khó chịu! Các thông báo UIApplicationWillChangeStatusBarFrameNotificationUIApplicationDidChangeStatusBarFrameNotification chỉ kích hoạt với thay đổi hướng và thay đổi độ cao thanh trạng thái trong cuộc gọi.

Tôi đã giải quyết vấn đề này bằng cách viết hàm danh mục setStatusBarHidden của riêng tôi mà tôi sử dụng thay cho hàm UIApplication bình thường. Thật không may (như @progrmr đã chỉ ra), vì chiều cao thanh trạng thái có thể là 20 pixel hoặc 40 pixel (và chúng tôi không biết gì về khung thanh trạng thái ẩn sẽ trở thành cho đến sau khi nó bị ẩn), chúng tôi chỉ có thể tắt đáng tin cậy một thông báo duy nhất với userInfo chính xác (UIApplicationDidChangeStatusBarFrameNotification). Dưới đây là những gì tôi đã làm:

@implementation UIApplication (statusBar) 

- (void)setStatusBarHiddenWithNotification:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation 
{ 
    if (self.statusBarHidden == hidden) return; 

    [self setStatusBarHidden:hidden withAnimation:animation]; 
    [NSNotificationCenter.defaultCenter postNotificationName:UIApplicationDidChangeStatusBarFrameNotification 
                 object:nil 
                userInfo:@{UIApplicationStatusBarFrameUserInfoKey: [NSValue valueWithCGRect:self.statusBarFrame]}]; 
} 

@end 

Nó hơi hacky, nhưng tôi thích nó bởi vì tôi có thể sử dụng các quan sát viên thông báo cùng nghe cho cả tình trạng thay đổi khung thanh trong cuộc gọi và hướng dẫn của tôi thay đổi khung setStatusBarHidden.

Hy vọng điều này sẽ giúp ai đó!

+0

Điều này giả định thanh trạng thái cao 20 điểm, thường là vậy, nhưng đôi khi nó là 40 (khi đang gọi điện thoại, khi điểm phát sóng đang hoạt động, v.v.), nhưng đây là một ý tưởng hay. – progrmr

+0

Điểm tốt. Tôi không biết rằng setStatusBarHidden thực sự ẩn thanh trạng thái trong cuộc gọi. Tôi nghĩ nó chỉ giấu thanh trạng thái bình thường. Vâng ... Tôi cho rằng bạn có thể sửa đổi chức năng này để chỉ kích hoạt thông báo UIApplicationDidChangeStatusBarFrameNotification và vượt qua chiều cao thanh trạng thái thực tế trong userInfo. –

+0

@progrmr Tôi đã sửa chức năng danh mục để sử dụng statusBarFrame của UIApplication. Thật không may điều này có nghĩa là chúng tôi không còn có thể kích hoạt thông báo UIApplicationWillChangeStatusBarFrameNotification một cách đáng tin cậy nữa bằng đúng userInfo đính kèm. –

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