Tôi đã thấy một số câu hỏi tương tự về vấn đề này, nhưng không có câu hỏi nào đáp ứng nhu cầu cụ thể của tôi. Tôi muốn có thể viết một phương thức trợ giúp chung để trả về kích thước khung tối đa có thể sử dụng cho UIView, xem xét liệu ứng dụng có kết hợp thanh trạng thái, thanh điều hướng và/hoặc thanh tab hay không. thời gian.Lập trình xác định kích thước khung tối đa có thể sử dụng cho một UIView
định nghĩa phương pháp sẽ là một phần mở rộng của UIScreen:
+ (CGRect) maximumUsableFrame;
Bắt kích thước có hoặc không có thanh trạng thái có thể được nhận được từ
[UIScreen mainScreen].applicationFrame
bất động sản, nhưng tôi không thể hình ra một cách để xác định nếu có một thanh điều hướng hoặc thanh tab hiện tại. Tôi đã nghĩ về việc duy trì một số cờ toàn cầu trong ủy nhiệm ứng dụng của tôi nhưng điều này có vẻ thực sự khó khăn và dừng mã là chung chung và có thể sử dụng lại được. Tôi cũng đã xem xét đi qua một UIView như một tham số, nhận được cửa sổ của khung nhìn, sau đó là rootViewController và sau đó nhìn thấy nếu tài sản điều khiển chuyển hướng được thiết lập. Nếu vậy thì kiểm tra xem bộ điều khiển điều hướng có bị ẩn hay không. Tất cả rất clunky nếu bạn hỏi tôi.
Bất kỳ suy nghĩ nào cũng sẽ được đánh giá cao.
Dave
EDIT: Kết hợp ý tưởng từ câu trả lời Caleb trong trường hợp này là sử dụng cho bất cứ ai khác:
// Extension to UIViewController to return the maxiumum usable frame size for a view
@implementation UIViewController (SCLibrary)
- (CGRect) maximumUsableFrame {
static CGFloat const kNavigationBarPortraitHeight = 44;
static CGFloat const kNavigationBarLandscapeHeight = 34;
static CGFloat const kToolBarHeight = 49;
// Start with the screen size minus the status bar if present
CGRect maxFrame = [UIScreen mainScreen].applicationFrame;
// If the orientation is landscape left or landscape right then swap the width and height
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
CGFloat temp = maxFrame.size.height;
maxFrame.size.height = maxFrame.size.width;
maxFrame.size.width = temp;
}
// Take into account if there is a navigation bar present and visible (note that if the NavigationBar may
// not be visible at this stage in the view controller's lifecycle. If the NavigationBar is shown/hidden
// in the loadView then this provides an accurate result. If the NavigationBar is shown/hidden using the
// navigationController:willShowViewController: delegate method then this will not be accurate until the
// viewDidAppear method is called.
if (self.navigationController) {
if (self.navigationController.navigationBarHidden == NO) {
// Depending upon the orientation reduce the height accordingly
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
maxFrame.size.height -= kNavigationBarLandscapeHeight;
}
else {
maxFrame.size.height -= kNavigationBarPortraitHeight;
}
}
}
// Take into account if there is a toolbar present and visible
if (self.tabBarController) {
if (!self.tabBarController.view.hidden) maxFrame.size.height -= kToolBarHeight;
}
return maxFrame;
}
Nếu Navigationbar và TabBar có thể nhìn thấy, bạn có thể tìm thấy chiều cao theo cách này: 'self.navigationController.navigationBar.frame.size.height;' và 'self.tabBarController.tabBar.frame.size.height'. Tại sao biến cho chiều cao tabbar gọi là kToolBarHeight?=) – Alexander
Tùy thuộc vào cách bạn muốn sử dụng điều này, ít nhất trong trường hợp của tôi, tôi cũng cập nhật nguồn gốc khung cho navController vì vậy tôi biết chính xác nơi tôi có thể định vị khung nhìn của tôi trong ViewController. Nếu không, bạn vẫn có thể kết thúc dưới thanh điều hướng. –