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