2012-01-15 38 views
9

Điều này trông đơn giản, đủ khi tôi thiết lập, nhưng tôi không thể giải thích tại sao khoảng cách này có mặt giữa thanh trạng thái và thanh điều hướng. Ngoài ra, chế độ xem có vẻ giống như nó có thể được căn chỉnh đúng cách và chỉ là thanh điều hướng được dịch chuyển xuống. Khoảng trống trông giống như kích thước của thanh trạng thái, vì vậy tôi hy vọng rằng có một cái gì đó để làm với nó, nhưng tôi không biết những gì.UINavigationController có khoảng cách thanh trạng thái thêm ở đầu

Nav Bar with extra space

Đây là mã lập bộ điều khiển chuyển hướng:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    advancedVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil]; 
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:advancedVC]; 
    nav.navigationBar.tintColor = [UIColor defaultNavBarTint]; 
    nav.navigationBar.topItem.title = NSLocalizedString(@"SearchTitle", nil); 
    UIBarButtonItem *searchButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"SearchButton", nil) style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];   
    nav.navigationBar.topItem.rightBarButtonItem = searchButton; 

    self.view = nav.view; 
} 

Các rootViewController sử dụng một cái nhìn từ một file xib, nơi tôi đã mô phỏng trên thanh trạng thái, thanh điều hướng, và thanh tab.

+0

Lưu ý rằng đây là khu vực có sự khác biệt giữa iOS 5 và các phiên bản cũ hơn. Nếu bạn sử dụng bố cục "đóng hộp" cho bộ điều khiển điều hướng thì nó khá di động, nhưng nếu bạn đã tùy chỉnh nó thì tất cả mọi thứ nhảy xung quanh một chút giữa hai phiên bản. (Tôi đã không bao giờ khá đóng đinh những gì làm cho sự khác biệt, nhưng những gì bạn đang hiển thị là điển hình cho iOS 4 mã chạy trên iOS 5.) –

+0

thấy câu trả lời đầu tiên của câu hỏi này http://stackoverflow.com/questions/5850705/why-do-navigation-xuất hiện-20-pixel-dưới-trạng thái-thanh-in-the-view – CarmeloS

Trả lời

0

Sự cố đã được giải quyết bằng cách sửa cách điều khiển bộ điều hướng được chèn vào. Thay vì chèn nó vào một khung nhìn đã được đưa vào bộ điều khiển thanh điều khiển, bộ điều khiển navigaiton nên được đặt trực tiếp vào bộ điều khiển điều hướng.

advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil]; 
UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC]; 

Đây chỉ là một bộ điều khiển trên bộ điều khiển tabbar, thay thế nâng caoSearchFormVC cùng một lúc. Sau đó, bộ điều khiển nav này đã được thêm vào mảng các bộ điều khiển đã được đưa vào bộ điều khiển thanh tabbar.

Xin lỗi vì bất kỳ sự cố nào, nhưng đây là một trong những vấn đề mà tôi có thể xem trực tiếp và không nhìn thấy. Tôi nên đã thấy điều này trước đó, bởi vì tôi đã có một bộ điều khiển nav khác đã có trên bộ điều khiển thanh tabbar, và nó đã được thiết lập theo cùng một cách.

Cảm ơn sự hỗ trợ của bạn.

+2

Jim - Tôi không theo giải pháp của bạn một cách chính xác. Bạn có thể đăng mã để hiển thị sửa lỗi thực tế không? – DoctorG

0

Vì bạn đang thêm advancedVC như là một subview của self.view, nó đang được thêm vào bên trong khung của self.view mà tôi đoán là đã bồi thường cho thanh trạng thái.

Bạn có thể có thể dễ dàng khắc phục điều này bằng cách thêm dòng này:

nav.view.frame = self.view.frame; 

Ngay trên dòng này:

self.view = nav.view; 

-

Suy nghĩ khác

Tôi không thuộc về toàn bộ thiết lập của bạn, nhưng self.view có thể không cần thiết chút nào. Chỉ cần tạo rootViewController của ví dụ UIWindow có trong App Delegate của bạn.

7

Tôi đã gặp vấn đề tương tự trước đây. Code tôi sử dụng để thêm UINavigationBar để UIViewController:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self]; 
[self.view addSubview:nc.view]; 

Giải pháp:
Kiểm tra hộp "Muốn Full Screen" với thuộc tính của thanh tra UIViewController của bạn.

10

Vấn đề thực sự là trình điều khiển điều hướng luôn mong muốn rời khỏi phòng cho thanh trạng thái, đó là khoảng cách 20 pixel.Tôi đã tìm kiếm xung quanh một lúc trước khi tôi tìm thấy giải pháp này hoạt động:

//nav is assumed to be a subclass or instance of UINavigationController 
nav.view.frame = CGRectOffset(nav.view.frame, 0.0, -20.0); 
//you can then add the navigation's view as a subview to something else 

Tôi đã tìm thấy câu trả lời đã làm điều này bù đắp cho chế độ xem của thanh điều hướng, nhưng nó không hoạt động. Nó hoạt động khi bạn làm điều đó với chế độ xem thực tế của bộ điều hướng.

Tôi sử dụng kỹ thuật này để thêm bộ điều khiển điều hướng từ một ngòi khác vào chế độ xem trống của ngòi chính của tôi, vì vậy tôi có thể định vị nó ở bất kỳ đâu trong màn hình chính dưới dạng chế độ xem phụ. Bằng cách sử dụng một khung nhìn trống như một giữ chỗ và khung định vị trên ngòi chính của tôi, tôi tạo ra một nib và lớp riêng để quản lý điều hướng, quản lý các ngòi khác được sử dụng để xử lý các màn hình của chúng. Bằng cách này tôi có thể giải quyết câu hỏi "làm cách nào để thêm biểu ngữ, hình ảnh hoặc chế độ xem tùy chỉnh phía trên trình điều khiển điều hướng" trong khi có trình điều khiển điều hướng dưới dạng xem phụ ... trong iOS 5 để cụ thể. Nó cũng đáng nói đến là tôi sử dụng ủy nhiệm ứng dụng để lưu trữ và truy cập tất cả các bộ điều khiển khác, vì vậy chúng được giữ lại bởi một cá thể kiên trì mà tôi có thể truy cập từ bất kỳ lớp nào. Tạo và tổng hợp một số thuộc tính trong ủy nhiệm ứng dụng của tất cả các bộ điều khiển của bạn và trong các trường hợp tạo viewDidLoad. Bằng cách đó tôi có thể tham khảo tất cả các bộ điều khiển được sử dụng trong ứng dụng của tôi sau này bất cứ nơi nào bằng cách thêm:

//this shows how to store your navigation controllers in the app delegate 
//assumes you've added 2 properties (UINavigationController*)"navController" and (UIViewController*)"rootController" in your app delegate 
//...don't forget to add #import "AppDelegate.h" to the top of the file 

AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
[app.navController pushViewController: app.rootController animated:YES]; 
//now apply the offset trick to remove the status gap 
app.navController.view.frame = CGRectOffset(app.navController.view.frame, 0.0, -20.0); 
+0

đã tìm thấy cùng một giải pháp, nhưng tôi không hài lòng với nó ... – iWheelBuy

+0

@Ali cảm ơn bạn đã giải pháp! thực sự tuyệt vời! – gaussblurinc

1

Như chúng ta đều biết bây giờ, sự thay đổi 20 điểm ảnh là cung cấp không gian cho thanh Status trên đỉnh. Nhưng không hoạt động, hệ thống phối hợp bộ điều khiển chế độ xem được giữ nguyên và chỉ có thanh khung điều hướng được dịch chuyển xuống 20 pixel. Điều này làm cho thanh điều hướng thực sự chồng lên 20 pixel đầu tiên của chế độ xem.

Logging nguồn gốc thanh navigation frame, nó sẽ hiển thị (0,0, 20,0)

Vì vậy, giải pháp là chỉ cần đặt lại vị trí gốc thanh điều hướng để (0.0, 0.0) trong viewWillAppear.

self.navigationController.navigationBar.frame = CGRectMake(0.0, 0.0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height); 
7

Bạn có thể cố gắng để thiết lập các thuộc tính Dưới Lên trên Barskiểm soát từ Thuộc tính phần của UIViewController.

+0

Điều này làm việc cho tôi, cảm ơn. –

0

Vấn đề là UINavigationController.view phải được thêm vào chế độ xem trên cùng. Chỉ cần tìm đầu và nó sẽ làm việc tuyệt vời.

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