2014-09-21 5 views
13

Sto avendo un bizzarro problema qui con iOS8. Ho cercato su Google e sbattendo la testa contro un muro per un paio di giorni senza fortuna. Non sono esattamente sicuro di come spiegarlo, ma ecco che ...La posizione di tocco iOS8 è limitata in Orizzontale, come se la finestra fosse Ritratto su un lato?

Le app funzionavano bene su iOS7, ma ora sto compilando usando xCode 6/iOS8 ho qualche strano problema di orientamento. Non sto usando un file xib, ma invece sto creando una finestra e una vista programmaticamente. Sto eseguendo OpenGL nella vista e quindi gestisco tutto il resto all'interno di OpenGL. Quindi sto raccogliendo tocchi e passandoli alle mie routine GL. Tutto è andato bene per sempre, fino ad ora.

Ora con iOS8 sembra che la "finestra di tocco" ruoti da sola in modo che i ritocchi in Orizzontale siano limitati a un lato dello schermo, come se la finestra di visualizzazione fosse Orizzontale, ma i tocchi sono tutti all'interno di una finestra verticale che è impostato su un lato dello schermo.

Ciò che sembra strano è che i tocchi arrivano alla vista su tutto lo schermo normalmente, ma il valore Y si ferma a 320 e non va oltre. L'X agisce normalmente. Se accendo il dispositivo su Portrait (il controller della vista non ruota automaticamente), funziona tutto, ma in Landscape passa a questo strano comportamento.

Ho provato tutto quello che posso pensare senza modifiche e non sono sicuro da dove cominciare a capire perché questo potrebbe accadere. Qualsiasi consiglio sarebbe molto apprezzato.

+0

Stai facendo affidamento su '[UIScreen mainScreen] .bounds' ovunque? È cambiato comportamento in iOS8, in precedenza '[UIScreen mainScreen] .bounds' mai 'ruotato' in quanto riportava sempre la stessa dimensione, ora che la dimensione 'ruota' e si dovrebbe interrogare' [UIScreen mainScreen] .nativeBounds' se si desidera una dimensione coerente che non 'ruota'. – Shizam

+0

Non stiamo facendo affidamento sui confini da nessuna parte che posso vedere, e sicuramente da nessun'altra parte ciò causerebbe questo. Finora l'unica soluzione che ho trovato che risolve tutti i problemi è di tornare a usare XCode 5! Quale non è davvero una soluzione affatto! – Rob

risposta

0

La mia ipotesi è che qualunque cosa vista possiede il sistema di riconoscimento gesto non è sempre ridimensionata durante la rotazione per una (o più) dei seguenti motivi:

  • Esso utilizza il layout automatico e non è inchiodato alla sua superview
  • Esso utilizza molle e puntoni e non ha mascherare l'UIViewAutoresizing corretta
  • vive in una visualizzazione secondaria che non è sempre ridimensionata

Se stai usando laico automatica fuori, prova questo nel vostro controller della vista:

- (void)viewDidLayoutSubviews 
{ 
    // For each subview with its own auto layout: 
    [self.mySubview layoutSubviews]; 

    // ... 

    [super viewDidLayoutSubviews]; 
} 
0

Ok, ho trovato il problema dalla mia parte (io sono il datore di taglie).

Eravamo probabilmente utilizzando qualche tipo di hack nel nostro App per gestire manualmente la rotazione dei nostri punti di vista, perché eravamo di ritorno 0 al - (NSUInteger)supportedInterfaceOrientations nel nostro RootViewController.

- (NSUInteger)supportedInterfaceOrientations { 
    return 0; // BOOOOOOO, even forbidden by documentation 
} 

Poi siamo riusciti manualmente le nostre opinioni interne ascoltando la notifica UIDeviceRotationChanged, ruotando loro punti di vista, e chiedendo la barra di stato per ruotare pure.

Restituire qualcosa non 0 a questo supportedInterfaceOrientations ha fatto ruotare il livello "tocco" insieme al resto.
Ma ora dobbiamo far evolvere il codice per utilizzare la rotazione di iOS invece del nostro livello di hacky.

Inoltre, dopo aver analizzato di più, soprattutto su iPad, è possibile utilizzare per utilizzare una UIWindow basata su Storyboard. L'utilizzo di una finestra basata su XIB farà sì che le sue dimensioni siano errate quando l'app viene lanciata mentre è in orizzontale. Questo porta a una montagna di cornici buggy e incasina male con il nostro layout.

1

Nel nostro caso.
La forza di ruotare con la trasformazione della vista ha causato quel problema.
Abbiamo rimosso quel codice, ruotano con

+ (void)attemptRotationToDeviceOrientation 

e problema risolto.

Abbiamo chiamato questo metodo con il nostro metodo forceRotate.

-(void)forceRotateLandscape { 
    ... 
    UIViewController *vc = [UIViewController new]; 
    [topVc presentViewController:vc animated:NO completion:nil]; 
    [topVc dismissViewControllerAnimated:NO completion:nil]; 

    supportedOrientations = UIInterfaceOrientationMaskLandscapeRight; 
    [UIViewController attemptRotationToDeviceOrientation]; 
    ... 
} 
+0

Questa è stata una delle cose che abbiamo provato all'inizio, ma in realtà non ha fatto alcuna differenza. Dove stai chiamando questo? – Rob

2

Su iOS8, UIScreen è ora orientato all'interfaccia. In alcune (o dovrei dire tutte) librerie prima di iOS8, sono stati fatti alcuni controlli per regolare la mancanza e la larghezza e l'altezza di scambio quando l'applicazione era in orizzontale.

Si dovrebbe guardare un codice che fa qualche rotazione e rimuoverlo.

-[UIScreen bounds],
-[UIScreen applicationFrame],
Stato telaio bar e
telaio tastiera sono ora interfacciarsi-orientato.
(cfr WWDC2014 Video - view controller advancements in iOS8 @ 50:41)

0

ho avuto lo stesso problema. In iOS7 tutto ha funzionato bene, in iOS8 era come se la "touch-view" fosse ancora in verticale.

Ho appena sostituito lo xib principale con uno storyboard, nessun altro cambiamento (ho provato molto a giocare con lo schermo e il frame senza risultati).

Provalo, fammi sapere se funziona anche per te. In bocca al lupo.

0

Ho lo stesso problema con la seconda finestra in orizzontale. Rifiuta di mostrarsi sullo schermo intero e anche di ricevere eventi di tocco sulla parte tagliata dello schermo. L'unica soluzione che ho trovato finora è quella di abilitare il supporto delle risoluzioni native iPhone6 ​​/ 6 + aggiungendo le schermate di avvio richieste. Se non supporti queste risoluzioni nella tua app potrebbe essere lo stesso problema.

Problemi correlati