Определить программно максимальный используемый размер кадра для UIView

Я встречал несколько подобных вопросов, но ни один из них не отвечал моей конкретной потребности. Я хочу иметь возможность написать общий вспомогательный метод, который возвращает максимальный используемый размер кадра для 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;
}
22
задан Magic Bullet Dave 12 August 2011 в 14:58
поделиться