2010-10-08 58 views
57

Tôi cần phải định lại kích thước một số yếu tố liên quan đến chiều cao của Thanh trạng thái của iPhone. Tôi biết rằng thanh trạng thái thường cao 20 điểm nhưng đây không phải là trường hợp khi ở chế độ chia sẻ kết nối. Nó được tăng gấp đôi lên 40. Cách thích hợp để xác định để xác định chiều cao của nó là gì? Tôi đã thửTải xuống thanh trạng thái của iPhone

[[UIApplication sharedApplication] statusBarFrame] 

nhưng nó mang lại cho tôi 20 x 480 cảnh quan chính xác nhưng sau đó nó mang lại cho tôi 320 x 40 chân dung. Tại sao nó không cho tôi đối lập với điều đó (40 x 320)?

+0

Thanh trạng thái có thể là 40px như thế nào? – Andy

+0

@Andy khi chia sẻ kết nối đang hoạt động, chiều cao thanh trạng thái tăng lên 40px –

+0

Hoặc khi có cuộc gọi đến – SwiftMatt

Trả lời

78

Trạng tháiBarFrame trả về khung trong tọa độ màn hình. Tôi tin rằng cách chính xác để có được những gì này tương ứng với quan điểm phối là phải làm như sau:

- (CGRect)statusBarFrameViewRect:(UIView*)view 
{ 
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 

    CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil]; 

    CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil]; 

    return statusBarViewRect; 
} 

Bây giờ trong hầu hết trường hợp cửa sổ sử dụng các tọa độ tương tự như màn hình, vì vậy [UIWindow convertRect:fromWindow:] không thay đổi bất cứ điều gì, nhưng trong trường hợp họ có thể khác phương pháp này nên làm điều đúng.

+2

Gọi phương thức này trong '- [UIViewController viewWillAppear:]' không hoạt động. Hai vấn đề: 1. Cửa sổ của khung nhìn là 'nil' rồi. 2. Ngay cả khi tôi đi trước lời gọi đến '- [UIWindow convertRect: fromWindow:]' với 'if (view.window)', khi tôi bật trở lại bộ điều khiển xem ở chế độ ngang, statusBarFrame có chiều rộng và chiều cao được chuyển đổi và gọi tới '- [UIView convertRect: fromView:]' không chuyển chúng trở lại chính xác. – ma11hew28

+0

@MattDiPasquale Tại sao không gọi nó trong 'viewDidAppear:' thay thế? – ThomasW

+1

Bởi vì, tôi đang điều chỉnh 'self.collectionView.contentInset' dựa trên' [UIApplication sharedApplication] .statusBarFrame'. Nếu tôi điều chỉnh nó sau khi khung nhìn xuất hiện, thì bạn có thể thấy nó nhảy. Vì vậy, tôi phải điều chỉnh nó trước khi khung nhìn xuất hiện. – ma11hew28

13

Bạn có làm điều đó như thế này:

CGRect rect; 

rect = [[UIApplication sharedApplication] statusBarFrame]; 
NSLog(@"Statusbar frame: %1.0f, %1.0f, %1.0f, %1.0f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); 
+0

Có, tôi đồng ý. Tôi đã đề cập rằng trong câu hỏi ban đầu của tôi. –

+19

Bạn cũng có thể sử dụng NSStringFromCGRect: 'NSLog (@" Khung thanh trạng thái:% @ ", NSStringFromCGRect (rect));' – progrmr

+4

Làm thế nào tất cả điều này được kết nối với sự cố ??? – Andy

5

Bạn có thể kiểm tra đó là ít hơn của hai giá trị, đó sẽ là chiều cao thực sự.

+0

Cảm ơn! [Tôi đã triển khai ý tưởng này] (http://stackoverflow.com/a/16598350/242933). Thật tuyệt vời! – ma11hew28

5

Phương pháp này hoạt động theo chiều dọc & hướng ngang.

-(float) statusBarHeight 
{ 
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size; 
    return MIN(statusBarSize.width, statusBarSize.height); 
} 

// example call 
float statusBarHeight = [self statusBarHeight]; 
+0

bạn có thể vui lòng cung cấp thêm chi tiết về giải pháp của mình không, cảm ơn! –

+0

Điều này có thể được sử dụng trong việc thực hiện ViewController của bạn. Ví dụ trong phương thức 'viewDidLoad'. –

5

EDIT iOS 11 cách để làm việc ra nơi để đặt phía trên cùng của nội dung quan điểm của bạn là UIView của safeAreaLayoutGuide Xem UIView Documentation.

NỮA ĐÁP Nếu bạn đang nhắm mục tiêu iOS 7 trở lên, Các tài liệu cho UIViewController khuyên rằng tài sản topLayoutGuide của viewController cung cấp cho bạn dưới cùng của thanh trạng thái, hoặc dưới cùng của thanh điều hướng, nếu nó cũng nhìn thấy được. Điều đó có thể được sử dụng, và chắc chắn là ít hack hơn so với nhiều giải pháp trước đó.

0

Dưới đây là phiên bản Swift nếu có ai cần nó:

var screenStatusBarHeight: CGFloat { 
    return UIApplication.sharedApplication().statusBarFrame.height 
} 

này được bao gồm như là một biến tiêu chuẩn trong:

https://github.com/goktugyil/EZSwiftExtensions

Disclaimer: nó repo của tôi

3

Swift 2:

let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height 

Swift 3 hoặc Swift 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height 

Lời khuyên: Đừng quên để tiêm UIApplication.shared không chỉ cần sử dụng singleton trong mã của bạn.

+1

Tại sao tôi không muốn sử dụng singleton? –

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