2012-02-06 2 views
7

Qual è la procedura migliore per calcolare le dimensioni della vista nel metodo loadView (in un UIViewController) senza un file XIB?Procedura consigliata per calcolare le dimensioni della vista all'interno del metodo loadView

Ecco la mia soluzione:

- (void)loadView { 

    //Calculate Screensize 
    BOOL statusBarHidden = [[UIApplication sharedApplication] isStatusBarHidden ]; 
    BOOL navigationBarHidden = [self.navigationController isNavigationBarHidden]; 
    BOOL tabBarHidden = [self.tabBarController.tabBar isHidden]; 

    CGRect frame = [[UIScreen mainScreen] bounds]; 

    if (!statusBarHidden) { 
    frame.size.height -= [[UIApplication sharedApplication] statusBarFrame].size.height; 
    } 
    if (!navigationBarHidden) { 
    frame.size.height -= self.navigationController.navigationBar.frame.size.height; 
    } 
    if (!tabBarHidden) { 
    frame.size.height -= self.tabBarController.tabBar.frame.size.height; 
    } 

    UIView *v = [[UIView alloc] initWithFrame: frame]; 
    [v setBackgroundColor: [UIColor whiteColor] ]; 
    [v setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ]; 
    [self setView: v ]; 
    [v release];  
} 

È questo codice va bene, o dovrei modificare qualcosa?

risposta

6

La documentazione consiglia di utilizzare [[UIScreen mainScreen] applicationFrame] per ottenere i limiti dello schermo, senza la barra di stato

+0

thx, ecco i documenti per chiunque sia interessato: https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UIScreen_Class/Reference/UIScreen.html#//apple_ref/occ/instp/UIScreen/applicationFrame – CarlJ

+0

[posso] (https://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIScreen_Class/Reference/UIScreen.html) – wattson12

+0

Su cosa si basa questa affermazione? Hai un riferimento? – lhunath

0

Si sta regolando l'altezza in base alla barra di stato e alle barre di navigazione .. Ma non si è fatto nulla rispetto all'origine della vista.

+0

sì l'origine è sempre {0, 0} . Se la barra di navigazione è visibile, il punto 0,0 si trova sotto la barra di navigazione. o mi sbaglio? – CarlJ

1

quindi per tutti coloro che vogliono conoscere un esempio di buone pratiche:

#pragma mark - 
#pragma mark LoadView Methods 
- (void)loadView { 

    //Calculate Screensize 
    BOOL statusBarHidden = [[UIApplication sharedApplication] isStatusBarHidden ]; 
    BOOL navigationBarHidden = [self.navigationController isNavigationBarHidden]; 
    BOOL tabBarHidden = [self.tabBarController.tabBar isHidden]; 
    BOOL toolBarHidden = [self.navigationController isToolbarHidden]; 

    CGRect frame = [[UIScreen mainScreen] applicationFrame]; 

    //check if you should rotate the view, e.g. change width and height of the frame 
    BOOL rotate = NO; 
    if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { 
    if (frame.size.width < frame.size.height) { 
     rotate = YES; 
    } 
    } 

    if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) { 
    if (frame.size.width > frame.size.height) { 
     rotate = YES; 
    } 
    } 

    if (rotate) { 
    CGFloat tmp = frame.size.height; 
    frame.size.height = frame.size.width; 
    frame.size.width = tmp; 
    } 


    if (statusBarHidden) { 
    frame.size.height -= [[UIApplication sharedApplication] statusBarFrame].size.height; 
    } 
    if (!navigationBarHidden) { 
    frame.size.height -= self.navigationController.navigationBar.frame.size.height; 
    } 
    if (!tabBarHidden) { 
    frame.size.height -= self.tabBarController.tabBar.frame.size.height; 
    } 
    if (!toolBarHidden) { 
    frame.size.height -= self.navigationController.toolbar.frame.size.height; 
    } 

    UIView *v = [[UIView alloc] initWithFrame: frame]; 
    v.backgroundColor = [UIColor whiteColor]; 
    v.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    self.view = v; 
    [v release]; //depends on your ARC configuration 
}