How do I rotate custom splash screen on iOS?

My splash screen is working, but my app works on landscape mode, and the splash screen shows in the default portrait mode.

How can I start the app so that the splash screen rotates between landscape modes like my app?

  • UISplitViewController and orientation - iOS < 5.0
  • why is my view still presented in landscape?
  • Set different supportedInterfaceOrientations for different UIViewControllers
  • How to play landscape video with MPMovieViewController in a portrait-only app
  • Force set Landscape orientation is not working in xib
  • how to set Orientation after launch on iPhone
  • I’m using the following code:

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
        interfaceOrientation == UIInterfaceOrientationLandscapeRight)
        return YES;
    else {
        return NO;  }
    }
    

    and for the splash screen

    -(void)displayScreen { 
    UIViewController *displayViewController=[[UIViewController alloc] init];
    displayViewController.view = displaySplashScreen;
    [self presentModalViewController:displayViewController animated:NO];
    [self performSelector:@selector(removeScreen) withObject:nil afterDelay:3.0];
    } 
     -(void)removeScreen
    {   [[self modalViewController] dismissModalViewControllerAnimated:YES];
    }
    

    But how can I put the rotate inside the display screen?

    4 Solutions Collect From Internet About “How do I rotate custom splash screen on iOS?”

    @zoul – loving this solution so far. however, if/when that view has any subviews – they don’t show up. any ideas?

    update:

    fixed this issue by adding a subview to the UIView created in -startupImageWithOrientation: not self.view.

    - (UIView *)startupImageWithOrientation:(UIInterfaceOrientation)io{
        UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"Default-%@.png", UIInterfaceOrientationName(io)]];
        UIView *aView = [[UIImageView alloc] initWithImage:img];
        [aView setFrame:[[UIScreen mainScreen] applicationFrame]];
    
        // define the version number label
        self.versionNumberLabel_iPadSplashScreen.text = [NSString stringWithFormat:@"Version %@", 
                                                                               [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]; 
    
        [aView addSubview:self.versionNumberLabel_iPadSplashScreen];
    
        return [aView autorelease];
    }
    

    Aha. If you want to display your own splash screen, you should create a special view controller for that, which you already did. I think you can simplify the autorotation query code:

    - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) foo
    {
        return YES; // all interface orientations supported
    }
    

    Now you have to think about the splash screens for different orientations. Do you have a separate splash image for landscape and portrait? If yes, you can do something like this:

    - (UIView*) startupImageWithOrientation: (UIInterfaceOrientation) io
    {
        UIImage *img = [UIImage imageNamed:[NSString
            stringWithFormat:@"Default-%@.png", UIInterfaceOrientationName(io)]];
        UIView *view = [[UIImageView alloc] initWithImage:img];
        [view setFrame:[[UIScreen mainScreen] applicationFrame]];
        return [view autorelease];
    }
    
    - (void) loadView
    {
        self.view = [self startupImageWithOrientation:self.interfaceOrientation];
    }
    
    - (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) io
        duration: (NSTimeInterval) duration
    {
        self.view = [self startupImageWithOrientation:io];
        self.view.transform = CGAffineTransformFromUIOrientation(io);
    }
    

    There are two utility functions called, you can stuff these into a separate file:

    NSString *UIInterfaceOrientationName(UIInterfaceOrientation io)
    {
        return UIInterfaceOrientationIsPortrait(io) ? @"Portrait" : @"Landscape";
    }
    
    CGAffineTransform CGAffineTransformFromUIOrientation(UIInterfaceOrientation io)
    {
        assert(io <= 4);
        // unknown, portrait, portrait u/d, landscape L, landscape R
        static float angles[] = {0, 0, M_PI, M_PI/2, -M_PI/2};
        return CGAffineTransformMakeRotation(angles[io]);
    }
    

    It’s a bit messy, I’d be interested in simpler solution myself.

    The resolution of your defult.png can effect your apps orientation if you have locked orientations.

    For example if a 1024×768 splash image is used and the initial view doesn’t support portrait viewing through orientation locks this can cause visual UI objects to appear off screen (especially when animation is involved) as the view will try and present itself in a portrait configuration even though the device may be in landscape.

    Generally, 1024×768 images imply portrait while 768×1024 images imply landscape.

    If this isn’t enough, or your wanting to seamlessly go from the initial default image into e.g a login screen, then you can use a viewcontroller to ‘continue’ the splash .

    Load all the normal viewControllers into the window, then put your ‘splash’ viewController in then in your splashController use shouldAutorotateToInterfaceOrientation method to set the right image (on an ImageViewController):

     - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        // Overriden to allow any orientation.
    
     switch ([[UIDevice currentDevice] orientation])
     {
      case UIInterfaceOrientationLandscapeRight:
       splashImage.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Default"] ofType:@"png"]];
       break;
      case UIInterfaceOrientationPortrait:
       splashImage.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Default"] ofType:@"png"]];
       break;
      default:
       splashImage.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Default2"] ofType:@"png"]];
       break;
     } 
    
       return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }
    

    The configuration of the images i have used may not suit you, so some experimentation might be needed.

    - (void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    
        if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
        {
            // take action here , when phone is "Portrait" 
    
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
        {
            action 4 LandscapeLeft
    
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
        {
            //PortraitUpsideDown
    
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        {
            //LandscapeRight
    
        }
    

    note that you should return YES the method shouldAutorotateToInterfaceOrientation: