Bạn có thể sử dụng một cái gì đó như UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)
để xác định hướng và sau đó sử dụng các kích thước cho phù hợp.
TUY NHIÊN, trong quá trình thay đổi hướng như trong UIViewController's
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Sử dụng hướng được chuyển vào toInterfaceOrientation
vì statusBarOrientation của UIApplication sẽ vẫn trỏ đến hướng cũ vì nó vẫn chưa thay đổi (vì bạn đang ở trong một will
trình xử lý sự kiện).
Tóm lược
Có một số bài đăng liên quan đến vấn đề này, nhưng mỗi bài đăng dường như chỉ ra rằng bạn phải:
- Nhìn vào
[[UIScreen mainScreen] bounds]
để có được kích thước,
- Kiểm tra định hướng của bạn và
- Tính chiều cao của thanh trạng thái (nếu được hiển thị)
Liên kết
Mã làm việc
Tôi thường không đi xa đến mức này, nhưng bạn đã kích thích sự quan tâm của tôi. Đoạn mã sau sẽ thực hiện thủ thuật. Tôi đã viết một Chuyên mục về Ứng dụng UIA. Tôi đã thêm các phương thức lớp để nhận được currentSize hoặc kích thước theo một hướng nhất định, đó là những gì bạn sẽ gọi trong UIViewController's willRotateToInterfaceOrientation:duration:
.
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
Để sử dụng mã cuộc gọi đơn giản [UIApplication currentSize]
. Ngoài ra, tôi đã chạy mã trên, vì vậy tôi biết nó hoạt động và báo cáo lại các phản hồi chính xác theo mọi hướng. Lưu ý rằng tôi nhấn vào thanh trạng thái. Điều thú vị là tôi đã phải trừ MIN của chiều cao và chiều rộng của thanh trạng thái.
Hi vọng điêu nay co ich. : D
Suy nghĩ khác
Bạn có thể bắt đầu lấy các thứ nguyên bằng cách xem thuộc tính của UIWindow rootViewController
. Tôi đã xem xét điều này trong quá khứ và nó tương tự báo cáo các kích thước giống nhau trong cả dọc và ngang ngoại trừ nó báo cáo có một biến đổi xoay:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]
<UILayoutContainerView: 0xf7296f0; khung = (0 0; 320 480); biến đổi = [0, -1, 1, 0, 0, 0]; tự động hóa = W + H; lớp = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]
<UILayoutContainerView: 0xf7296f0; khung = (0 0; 320 480); tự động hóa = W + H; lớp = <CALayer: 0xf729b80 >>
Không chắc ứng dụng của bạn hoạt động như thế nào, nhưng nếu bạn không sử dụng một bộ điều khiển điều hướng nào đó, bạn có thể có UIView dưới chế độ xem chính của mình với chiều cao / chiều rộng tối đa của cha mẹ và lớn lên / thu nhỏ lại với cha mẹ. Sau đó, bạn có thể làm: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]
. Điều đó trông khá dữ dội trên một dòng, nhưng bạn có ý tưởng.
Tuy nhiên ... Sẽ tốt hơn nếu bạn thực hiện 3 bước trên dưới phần tóm tắt. Bắt đầu làm rối với UIWindows và bạn sẽ tìm ra những thứ kỳ lạ, chẳng hạn như hiển thị UIAlertView sẽ thay đổi keywindow của UIApplication để trỏ đến UIWindow mới mà UIAlertView đã tạo. Ai biết? Tôi đã làm sau khi tìm thấy một lỗi dựa trên keyWindow và phát hiện ra rằng nó đã thay đổi như vậy!