iPhone app in landscape-modus, 2008-systemen

stemmen
88

Let op: deze vraag is vanaf 2008 en nu slechts van historisch belang.


Wat is de beste manier om een ​​iPhone-applicatie die draait in landscape-modus vanaf het begin, ongeacht de positie van het apparaat te maken?

Zowel programmatisch en met behulp van de Interface Builder.

De vraag is gesteld op 02/08/2008 om 11:47
bron van user
In andere talen...                            


8 antwoorden

stemmen
46

enige historische antwoord. Spectaculair verouderd:

Houd er rekening mee dat dit antwoord is nu enorm verouderd.

Dit bericht is slechts een historische curiositeit .


Opwindend nieuws! Zoals ontdekt door Andrew hieronder, is dit probleem opgelost door Apple in 4.0+.

Het lijkt is het niet langer noodzakelijk is om de grootte van het uitzicht op elke uitzicht, en de specifieke ernstig probleem van het landschap "alleen werken de eerste keer" force is opgelost.

Met ingang van april 2011 is het niet mogelijk om te testen of zelfs iets minder dan 4,0 te bouwen, dus de vraag is puur een historische nieuwsgierigheid. Het is ongelooflijk hoe veel moeite het veroorzaakt ontwikkelaars zo lang!


Hier is de originele discussie en oplossing. Dit is nu volstrekt irrelevant, omdat deze systemen zijn niet eens bediend.


Het is uiterst moeilijk om dit werk volledig te doen - er zijn ten minste drie problemen / bugs in het spel.

probeer dit .. Interface Builder landschapsontwerp

Merk in het bijzonder dat waar het zegt "en je moet shouldAutorotateToInterfaceOrientation goed overal gebruiken" het overal betekent, al uw fullscreen uitzicht.

Hoop dat het helpt in deze nachtmerrie!

Een belangrijke herinnering aan de EXTRA bekend probleem bij de hand hier: als je probeert om te wisselen tussen MEER DAN EEN view (alle landschap), IT werkt gewoon niet . Het is essentieel om dit te onthouden of u zult dagen verspillen aan het probleem. Het is letterlijk niet mogelijk. Het is het grootste open is, bekend, bug op het iOS-platform. Er is letterlijk geen manier om de hardware te maken van de tweede weergave die u wilt laden, zijn landschap. Het vervelende maar eenvoudige oplossing, en wat je moet doen, is een triviale meester UIViewController dat er niets, maar er zitten en laat je wisselen tussen uw standpunten doet.

Met andere woorden, in iOS als gevolg van een grote kennis bug:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

U kunt dat doen maar een keer . Later, als je probeert te happyThing.view te verwijderen, en in plaats daarvan zet daar in newThing.view, werkt het niet - en dat is dat. De machine zal nooit draaien het oog op het landschap. Er is geen truc fix, zelfs Apple kan het niet laten werken. De oplossing moet u vast te stellen wordt met een totale UIViewController dat er gewoon zit en gewoon houdt je verschillende aanzichten (happyThing, newThing, etc). Hoop dat het helpt!

antwoordde op 27/03/2010 om 22:13
bron van user

stemmen
40

Van de Apple Dev Site:

Om uw aanvraag in landscape-modus te starten, zodat de statusbalk is in de juiste positie onmiddellijk, bewerk je Info.plist bestand naar de UIInterfaceOrientation sleutel toe te voegen met de juiste waarde (UIInterfaceOrientationLandscapeRight of UIInterfaceOrientationLandscapeLeft), zoals getoond in listing 2.

Listing 2: Start uw aanvraag in landscape-modus

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
antwoordde op 31/08/2008 om 15:38
bron van user

stemmen
27

Samenvatting en integratie van alle berichten, na het testen van het zelf; check de update voor 4.x, 5.x hieronder.

Vanaf 3.2 kunt u de oriëntatie van een actieve toepassing van de code te wijzigen.

Maar je kunt een applicatie met een vaste oriëntatie te starten, maar doen dus dit is niet eenvoudig.

Probeer met dit recept:

  1. stel uw oriëntatie op UISupportedInterfaceOrientationsin de Info.plistfile
  2. in uw venster definieert u een 480x320 "base view controller". Iedere andere weergave zal worden toegevoegd als een subweergave om haar standpunt.
  3. in alle view controllers opzetten van de shouldAutorotateToInterfaceOrientation:methode (op dezelfde waarde die u hebt gedefinieerd in de plist terug, natuurlijk)
  4. in alle view controllers om een ​​achtergrond weergave met

    self.view.frame = CGRectMake(0, 0, 480, 320)

    in de viewDidLoadwerkwijze.

Update (iOS 4.x, 5.x) : de Apple iOS App Programming Guide heeft een "De lancering in de liggende stand" paragraaf in de "Advanced App trucs" hoofdstuk.

Referenties:

antwoordde op 07/05/2010 om 12:02
bron van user

stemmen
7

Eerst zette ik in info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

dan heb ik deze code in applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

Op deze manier kan ik werken op het uitzicht in Interface Builder in landscape-modus.

antwoordde op 20/11/2009 om 21:58
bron van user

stemmen
6

antwoord SASG en michaelpryor's lijkt juist te zijn, maar als het niet voor u werkt, probeer dit alternatief:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

Of deze:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Of deze:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

U kunt ook bellen window makeKeyAndVisible;eerste.

Een paar links: Ontwikkelen in landscape-modus , iPhone SDK: Hoe wordt alleen in liggende stand te dwingen?

@Robert: verwijzen wij u naar de iPhone SDK, NDA, en stack overflow .

antwoordde op 31/08/2008 om 16:01
bron van user

stemmen
5

Ik ben verbaasd dat niemand heeft tot nog met dit antwoord komen:

In mijn testen bij een ontslag van een modale view controller voorkeursoriëntatie de ouder view controller in shouldAutorotateToInterfaceOrientationwordt gehonoreerd, zelfs wanneer een deel van een UINavigationController. Dus de oplossing hiervoor is simpel:

Maak een dummy UIViewController met een UIImageView voor een achtergrond. Stel de afbeelding om de Default.png imago van uw app gebruikt bij het opstarten.

Wanneer viewWillAppearwordt aangeroepen in je root view controller, toon dan de dummy view controller zonder animatie.

wanneer viewDidAppearwordt aangeroepen in uw dummy view controller, te ontslaan van het uitzicht controller met een mooi kruis op te lossen animatie.

Niet alleen doet dit werk, maar het ziet er goed uit! BTW, alleen ter verduidelijking ik doe de wortel view controller viewWillAppearals volgt uit:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}
antwoordde op 27/11/2010 om 08:38
bron van user

stemmen
4

De nieuwste iPhone OS Programming Guide heeft een sectie over dit, met het monster code. Ik weet zeker dat dit is een recente toevoeging, dus misschien heb je het gemist. Het verklaart alle voorwaarden u moet voldoen; eigenlijk...

  • Stel de Info.plist eigenschappen (dit verandert de positie van de statusbalk, maar niet het uitzicht)
  • draai je je oog handmatig rond het middelpunt, aan beide uw UIViewController viewDidLoad: methode of uw applicationDidFinishLaunching: methode of implementeren van automatische rotatie ( "automatisch wordt gewijzigd gedrag", pagina 124)

Kijk voor "De lancering in de liggende stand", pagina 102.

antwoordde op 04/09/2008 om 22:57
bron van user

stemmen
3

Zie dit antwoord: de liggende stand ALLEEN voor iPhone of iPad

  1. voeg oriëntatie plist
  2. shouldAutorotateToInterfaceOrientation = YES in alle bestanden

Maar als je gebruik maakt van gemengde modes, kunt u beter af met zijn

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
antwoordde op 06/03/2011 om 08:56
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more