J'ai vu plusieurs questions similaires à cela, mais aucune qui répond à mes besoins spécifiques. Je veux être capable d'écrire une méthode d'assistance générique qui renvoie la taille de trame utilisable maximale pour un UIView, en prenant en compte si l'application a une combinaison de barre d'état, de barre de navigation et/ou de barre d'onglets. le temps.Déterminer par programme la taille de trame maximale utilisable pour un UIView
définition de la méthode serait comme une extension de UIScreen:
+ (CGRect) maximumUsableFrame;
Obtenir la taille avec ou sans la barre d'état peut être obtenu à partir de la
[UIScreen mainScreen].applicationFrame
propriété, mais je ne peux pas un moyen de déterminer si une barre de navigation ou une barre d'onglets est présente. J'ai pensé à conserver des drapeaux globaux dans mon délégué d'application, mais cela semble vraiment maladroit et empêche le code d'être générique et réutilisable. J'ai également envisagé de passer un UIView en paramètre, d'obtenir la fenêtre de la vue, puis le rootViewController puis de voir si la propriété du contrôleur de navigation est définie. Si oui, vérifiez si le contrôleur de navigation est caché. Tout est très maladroit si vous me demandez.
Toutes les pensées seraient appréciées.
Dave
EDIT: L'intégration des idées de la réponse de Caleb dans le cas où cela est utile à quelqu'un d'autre:
// 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;
}
Si NavigationBar et TabBar sont visibles, vous pouvez trouver des hauteurs de cette façon: 'self.navigationController.navigationBar.frame.size.height,' et 'self.tabBarController.tabBar.frame.size.height'. Pourquoi une variable pour la hauteur des tabulations appelée kToolBarHeight?=) – Alexander
Selon la façon dont vous voulez l'utiliser, au moins dans mon cas, j'ai également mis à jour l'origine de l'image pour le navController afin que je sache exactement où je pourrais positionner ma vue dans le ViewController. Sinon, vous pourriez toujours finir sous la barre de navigation. –