Я встречал несколько подобных вопросов, но ни один из них не отвечал моей конкретной потребности. Я хочу иметь возможность написать общий вспомогательный метод, который возвращает максимальный используемый размер кадра для UIView, принимая во внимание, есть ли в приложении какая-либо комбинация строки состояния, панели навигации и / или панели вкладок, когда я все это делаю время.
Определение метода будет как расширение UIScreen:
+ (CGRect) maximumUsableFrame;
Получение размера со строкой состояния или без нее можно получить из
[UIScreen mainScreen] .applicationFrame
свойство,но я не могу понять, как определить, присутствует ли панель навигации или панель вкладок. Я думал о сохранении некоторых глобальных флагов в моем делегате приложения, но это кажется действительно неуклюжим и не позволяет использовать общий и повторно используемый код. Я также рассмотрел возможность передачи UIView в качестве параметра, получения окна представления, затем rootViewController и затем проверки, установлено ли свойство контроллера навигации. Если да, то проверьте, скрыт ли контроллер навигации. Все очень неуклюже, если вы спросите меня.
Любые мысли приветствуются.
Дэйв
РЕДАКТИРОВАТЬ: Включение идей из ответа Калеба на случай, если это будет полезно кому-то еще:
// 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;
}