2010-11-20 38 views
14

Tôi đang cố tạo giao diện tương tự như ứng dụng Ảnh nơi thanh trạng thái & thanh điều hướng mờ dần vào/ra nhưng tôi đang gặp sự cố. Nếu tôi nhấn để ẩn giao diện, sau đó xoay thiết bị, sau đó nhấn để sao lưu thiết bị, sau đó thanh điều hướng được đặt lại vị trí bên dưới thanh trạng thái (xem ảnh). Nếu sau đó tôi xoay thiết bị, thanh điều hướng sẽ trở lại vị trí thích hợp của nó. Làm thế nào tôi có thể sửa lỗi này?UINavigationBar Xuất hiện dưới StatusBar

alt text

Trả lời

32

Điều này có thể đến trễ một chút nhưng tôi vừa có cùng một vấn đề. Tôi đang desiging một người đọc xem toàn màn hình với thanh trạng thái trong suốt, thanh điều hướng và thanh công cụ mà bạn có thể mờ dần vào và ra bằng cách khai thác ở trung tâm của màn hình. Cách tôi đã quản lý để sửa chữa nó thực sự là đơn giản, về cơ bản cốt lõi của vấn đề nếu điều này: Khi bạn xoay chế độ xem và NavigationController tính toán lại vị trí mới của nó, nó nghĩ rằng nó phải ở trên cùng của cửa sổ vì thanh trạng thái bị ẩn. Khi bạn hiển thị cả thanh trạng thái và thanh điều hướng sau đó, chúng sẽ chồng lên nhau.

Cách khắc phục điều này thực sự dễ dàng, chỉ cần giữ BOOL để nhớ xem lớp phủ của bạn có được hiển thị hay ẩn và triển khai cả willRotateToInterfaceOrientation và willAnimateRotationToInterfaceOrientation trong ViewController của bạn.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (!isOverlayShowing) 
    { 
     [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
    } 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (!isOverlayShowing) 
    { 
     [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    } 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 

Bằng cách hiển thị nhanh và ẩn thanh trạng thái theo hai phương pháp này, StatusBar được hiển thị tại thời điểm chính xác NavigationBar tính toán lại vị trí của nó. Tôi không biết nếu đây là triển khai tốt nhất để khắc phục vấn đề này, nhưng cho đến nay phương pháp này hoạt động và không tạo ra bất kỳ nhấp nháy trên màn hình và rất trơn tru.

Tôi hy vọng người khác có vấn đề của tôi có thể vấp ngã khi đăng bài này và tìm giải pháp dễ dàng này cho vấn đề này.

+8

Cảm ơn bạn.Điều này đã khiến tôi khốn khổ. – bdmontz

+3

Wow, wow. Đây là giải pháp tôi đã tìm kiếm! Vấn đề của tôi là nếu người dùng đóng ứng dụng, xoay thiết bị và khởi chạy lại nó, tôi sẽ nhận được thanh trạng thái phủ lên. Nó thậm chí không xảy ra với tôi rằng có lẽ các sự kiện luân phiên đã bị sa thải cho các cuộc phỏng vấn về tái khởi động. Điều này giải quyết nó! – Shizam

+1

Bạn, thưa Ngài, là một quý ông, một học giả và một hiệp sĩ. –

1

Thật không may, thật khó chịu. Khi ẩn thanh trạng thái, về cơ bản nó mở ra không gian đó cho uiviewcontrollers để sử dụng. Với autoresizing trên, nó về cơ bản sẽ di chuyển vào không gian đó bởi vì nó không có ý tưởng rằng bạn sẽ muốn sử dụng không gian đó một lần nữa. Đặt cược tốt nhất của bạn là thay đổi kích thước chế độ xem theo cách thủ công để khi thanh trạng thái xuất hiện trở lại, bạn cũng thu hẹp chế độ xem xuống để nó được đặt chính xác bên dưới thanh trạng thái.

3

Giải pháp khác (đơn giản hơn) là đặt lại khung nhìn của cấp cao nhất khi hiển thị lại thanh trạng thái; ví dụ.

- (void)exitFullScreenMode 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; 

    // work-around for navigation bar appearing under status bar - must be called before -setNavigationBarHidden: 
    self.view.window.rootViewController.view.frame = [UIScreen mainScreen].applicationFrame; 

    [self.navigationController setNavigationBarHidden:NO animated:NO]; 
} 
0
if (self.navigationController.navigationBarHidden) 
{ 
    /******* Cancel Fullscreen ****/ 
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) 
     [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 

    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
} 
else { 
    /******* Enable Fullscreen ****/ 
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; 

    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setToolbarHidden:YES animated:YES]; 
} 
1

Tôi đã có vấn đề thiết lập alpha = 0 cho Navigationbar để ẩn nó. Vì vậy, rõ ràng, sau khi gọi:

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; 

Bạn có thể loại bỏ các Navigationbar bằng cách gọi ẩn và tái chèn nó vào trong xem và sau đó thiết lập các alpha = 0:

//hiding and showing to redraw navigationBar over the status bar 
self.navigationController.navigationBarHidden = YES; 
self.navigationController.navigationBarHidden = NO; 
self.navigationController.navigationBar.alpha = 0; 

này sẽ giải quyết thêm không gian mà thanh trạng thái được sử dụng để chiếm.

0

Cố định vấn đề này bằng cách:

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 

    self.navigationController.navigationBarHidden = YES; 
    self.navigationController.navigationBarHidden = NO; 
Các vấn đề liên quan