• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

[presentModalViewController] bei Drehung

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Hallo,

einfach gesagt: Ich möchte meine App etwas interaktiver gestalten und wollte deswegen, dass, wenn das iPhone gedreht wird ein anderer Screen präsentiert wird. Gehen tut es so grob schon, allerdings ist die Darstellung noch etwas falsch: Wenn ich vom Portrait in den Landscape zum ersten mal drehe, erscheint mein neues View zwar, aber noch nicht im Landscape, sonder immer noch im Portrait-Mode. Um diesen Fehler zu behen, muss das iPhone kurz wieder in den Portrait-Mode gedreht werden(diesmal erfolgt keine aktualisierung des Screens?!) und dann wieder in den Landscape. Beim zweiten mal drehen in den Landscape-Modus dreht sich dann das modalView in den passenden Modus....Was schafft abhilfe? Hier der Code:
Code:
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{
	[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
	if (oldStatusBarOrientation == UIInterfaceOrientationPortrait) {
		
		rechner = [[RechnerViewController alloc] initWithNibName:@"RechnerViewController" bundle:[NSBundle mainBundle]];
		//[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
		[self.tabBarController presentModalViewController:rechner animated:YES];
		
		NSLog(@"tadaaaa! mit alter orientation");
		return;
	}
	if (application.statusBarOrientation == UIInterfaceOrientationPortrait) {
		[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
		[self.tabBarController dismissModalViewControllerAnimated:YES];
		[rechner.view removeFromSuperview];
		rechner = nil;
		NSLog(@"schwups und weg mit alter orientation:");
		return;
	}
}
 

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Hui, jetzt wird es gruselig: Auf dem iPad-Simulator geht es, aber sofort, wenn hinter dem "i" was anderes als "Pad" steht geht es nicht mehr. Wenn man im iPhone-Simulator auf Hardware>Links/Recht drehen geht, dreht es sich, der Screen wird geupdated und dann dreht sich der Simulator wieder in den Portrait-Mode...was habe ich vergessen? :D
 

Miralem23

Kaiser Wilhelm
Registriert
24.11.08
Beiträge
178
kannst du mal das Projekt hochladen? Vllt kann dir dadurch besser geholfen werden.
 

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Nein, geht leider nicht, erstens ist das zu groß und zweitens "geheim" :D Also wenn ihr mir einzelne Dateien nennt, dann ja...Sieht so aus, dass ich einen TabBarController habe, der dann meistens UInavigationController mit normalen ViewController bzw. UITableViewController als rootViewController gesetzt haben...
Aber mir ist noch was aufgefallen: Noch mal umgebaut:
Code:
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{
	if (oldStatusBarOrientation == UIInterfaceOrientationPortrait) {
		NSLog(@"Portrait");
	}
	//[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
	if (oldStatusBarOrientation == UIInterfaceOrientationPortrait) {
		
		rechner = [[RechnerViewController alloc] initWithNibName:@"RechnerViewController" bundle:[NSBundle mainBundle]];
		//[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
		if (([UIDevice currentDevice].orientation) != UIInterfaceOrientationPortrait) {
			NSLog(@"Nicht im Portrait mode!");
		}
		[self.tabBarController presentModalViewController:rechner animated:YES];
		
		NSLog(@"tadaaaa! mit alter orientation");
		return;
	}
	else if (oldStatusBarOrientation != UIInterfaceOrientationPortrait) {
		//[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
		[self.tabBarController dismissModalViewControllerAnimated:YES];
		[rechner.view removeFromSuperview];
		rechner = nil;
		NSLog(@"schwups und weg mit alter orientation:");
		return;
	}
}
Ich habe in die Methode ja Logs eingebaut...Wenn ich das iPhone jetzt also drehe, erscheinen beide Logs, und zwar in dieser Reihenfolge:
Code:
2010-08-10 22:15:02.099 MathPro[6264:307] Portrait
2010-08-10 22:15:02.108 MathPro[6264:307] Nicht im Portrait mode!
2010-08-10 22:15:02.208 MathPro[6264:307] schwups und weg mit alter orientation:
2010-08-10 22:15:02.252 MathPro[6264:307] tadaaaa! mit alter orientation


ich bin echt ziemlich ratlos >.<
Irgendwas wird da zwischendurch noch an oldStatusBarOrientation geändert, sowas ähnliche wie die super methode...aber das ist es ja nicht..oder dauert die Animation einfach ein bisschen, bis sie "wirkt" und man muss einen kurzen
Code:
sleep()
einbauen?
 

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Okay, ich habe die Antworte gefunden, nachdem ich noch einige Stunden rumprobiert habe: Es lag anscheinend daran, dass die Methode
Code:
[self.viewController presentModalViewController:aViewController animated:aBOOL];
von Apple nur für den Portrait-Mode implementiert wurde. Also hat die Methode korrekt in den Landscape gedreht, dann wurde in in der if-Schleife allerdings die erwähnte Methode getriggert, dieses hat dann das Delegate "geforced" wieder zurück in den Portrait-Modus zu drehen. Mein Code sieht jetzt so aus:
Code:
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{
	if(([UIDevice currentDevice].orientation == UIInterfaceOrientationLandscapeLeft) || ([UIDevice currentDevice].orientation == UIInterfaceOrientationLandscapeRight)){
		rechner = [[RechnerViewController alloc] initWithNibName:@"RechnerViewController" bundle:[NSBundle mainBundle]];
		[self.window addSubview:rechner.view];
		[self.window bringSubviewToFront:rechner.view];
		[self.tabBarController.view removeFromSuperview];
	}else{
		[rechner.view removeFromSuperview];
		[self.window addSubview:self.tabBarController.view];
		[self.window bringSubviewToFront:self.tabBarController.view];
		[rechner release];
	}
}