2010-12-07 5 views
5

Mein Begrüßungsbildschirm funktioniert, aber meine App funktioniert im Querformat und der Begrüßungsbildschirm wird im Standard-Hochformat angezeigt.Wie kann ich benutzerdefinierte Splash-Bildschirm auf iOS drehen?

Wie kann ich die App starten, sodass der Begrüßungsbildschirm zwischen Landschaftsmodi wie meiner App rotiert?

Ich verwende den folgenden Code:

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

und für den 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]; 
} 

Aber wie kann ich das Drehen im Inneren des Bildschirms setzen?

+0

Dieser Beitrag hat wirklich _nothing_ mit Xcode zu tun. Also, ich habe dieses Wort aus deinem Titel entfernt. –

+0

hinzugefügt iphone & ipad tags, wie viele Leute haben diese als fav's und Sie werden eine bessere Sicht zählen –

Antwort

3

@zoul zurückkehren sollte - diese Lösung zu lieben so weit. Wenn diese Ansicht jedoch Unteransichten enthält, werden sie nicht angezeigt. irgendwelche Ideen?

Update:

dieses Problem behoben, indem ein Subview der in -startupImageWithOrientation:nicht self.view erstellt UIView hinzufügen.

- (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]; 
} 
4

Aha. Wenn Sie Ihren eigenen Begrüßungsbildschirm anzeigen möchten, sollten Sie dafür einen speziellen View-Controller erstellen, den Sie bereits erstellt haben. Ich denke, Sie können den Autorotationsabfragecode vereinfachen:

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

Jetzt müssen Sie über die Splashscreen für verschiedene Orientierungen denken. Haben Sie ein separates Splash-Bild für Quer- und Hochformat? Wenn ja, können Sie etwas tun:

- (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); 
} 

Es gibt zwei Utility-Funktionen genannt, können Sie diese in eine separate Datei stopfen:

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]); 
} 

Es ist ein bisschen chaotisch, ich würde interessieren in einer einfacheren Lösung.

1

Die Auflösung Ihrer defult.png kann die Orientierung Ihrer Apps beeinflussen, wenn Sie die Ausrichtung gesperrt haben.

Wenn beispielsweise ein 1024x768-Splash-Bild verwendet wird und die ursprüngliche Ansicht keine Portraitanzeige durch Ausrichtungssperren unterstützt, kann dies dazu führen, dass visuelle UI-Objekte außerhalb des Bildschirms angezeigt werden (insbesondere wenn Animationen vorhanden sind) selbst in einer Hochformatkonfiguration, obwohl das Gerät im Querformat sein könnte.

Im Allgemeinen implizieren 1024x768 Bilder Porträt, während 768x1024 Bilder Landschaft implizieren.

Wenn dies nicht ausreicht oder wenn Sie nahtlos vom ursprünglichen Standardbild in einen Anmeldebildschirm wechseln möchten, können Sie den Splash mit einem Viewcontroller fortsetzen.

laden alle normalen Viewcontrollers in das Fenster, legte dann ‚Splash‘ Viewcontroller in dann in Ihrem splashController Verwendung shouldAutorotateToInterfaceOrientation Methode das richtige Bild zu setzen (auf 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); 
} 

Die Konfiguration der Bilder, die ich benutzt habe, passen vielleicht nicht zu dir, daher sind einige Experimente nötig.

0
- (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 

    } 

beachten Sie, dass Sie YES, um die Methode shouldAutorotateToInterfaceOrientation: