viewDidLoad always in portrait even iPad is in landscape, viewDidLoad永遠是以portrait mode開始

  • warning: Declaration of views_handler_argument::init(&$view, &$options) should be compatible with views_handler::init(&$view, $options) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_argument.inc on line 745.
  • warning: Declaration of views_handler_filter::options_validate(&$form, &$form_state) should be compatible with views_handler::options_validate($form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_filter.inc on line 585.
  • warning: Declaration of views_handler_filter::options_submit(&$form, &$form_state) should be compatible with views_handler::options_submit($form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_filter.inc on line 585.
  • warning: Declaration of views_handler_filter_boolean_operator::value_validate(&$form, &$form_state) should be compatible with views_handler_filter::value_validate($form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_filter_boolean_operator.inc on line 149.
  • warning: Declaration of views_plugin_style_default::options(&$options) should be compatible with views_object::options() in /home/xnvgu7/public_html/sites/all/modules/views/plugins/views_plugin_style_default.inc on line 25.
  • warning: Declaration of views_plugin_row::options_validate($form, &$form_state) should be compatible with views_plugin::options_validate(&$form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/plugins/views_plugin_row.inc on line 135.
  • warning: Declaration of views_plugin_row::options_submit($form, &$form_state) should be compatible with views_plugin::options_submit(&$form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/plugins/views_plugin_row.inc on line 135.

 在做admob廣告時,橫向(Landscape)和直向(portrait)廣告大小不同,所以在進入viewDidLoad時需要知道是橫向或直向,但是一進viewDidLoad永遠是直向(portrait),用下方法測試可知:

 

if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight)

    {//iPad Landscape

        NSLog(@"1. iPad Landscape -- viewDidLoad");

    }

    else{//iPad Portrait

        NSLog(@"1. iPad Portrait -- viewDidLoad");

    }

    

    if ([self interfaceOrientation] == UIInterfaceOrientationPortrait || [self interfaceOrientation] == UIInterfaceOrientationPortraitUpsideDown)

    {//iPad Landscape

        NSLog(@"2. iPad Portrait -- viewDidLoad");

    }

    else{//iPad Portrait

        NSLog(@"2. iPad landscape -- viewDidLoad");

    }

    

    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight )

    {//iPad Landscape

        NSLog(@"3. iPad landscape -- viewDidLoad");

    }

    else{//iPad Portrait

        NSLog(@"3. iPad portrait -- viewDidLoad");

若device是iPad或device是iPad retina,且用iPad5.0 simulator,結果是:

1. iPad Portrait -- viewDidLoad

2. iPad Portrait -- viewDidLoad

3. iPad Portrait -- viewDidLoad

而且,iPad會轉成portrait。

若device是iPad或device是iPad retina,且用iPad6.0 simulator,結果是:

1. iPad Landscape -- viewDidLoad

2. iPad Landscape -- viewDidLoad

3. iPad portrait -- viewDidLoad

所以,if ([[UIDevice currentDeviceorientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDeviceorientation] == UIDeviceOrientationLandscapeRight )測試必定不對。

另兩個測試雖然在iPad6.0 simulator對了,但是viewDidLoad的view並未成為landscape,仍是768x1004。

所以需把與orientation相關之事放在willAnimateRotationToInterfaceOrientation做

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration

 但是,這又發生一個問題,若iPad本為直向(portrait)或在iPad6.0 simulator下,則不會呼叫willAnimateRotationToInterfaceOrientation。

 

原始發現來自Link的answer6