Metodi di rotazione obsoleti, equivalenti a "didRotateFromInterfaceOrientation"?


137

Sto cercando di implementare il nuovo viewWillTransitionToSizemetodo che è stato introdotto in iOS 8 (tutti gli altri metodi di rotazione sono stati deprecati). Mi piacerebbe sapere qual è l'equivalente di didRotateFromInterfaceOrientationora in quanto ci sono un certo numero di attività di pulizia che dobbiamo eseguire e non riesco a vedere un blocco che possiamo assegnare UIViewControllerTransitionCoordinatorper essere chiamato quando 'passaggio' a un nuovo dimensioni finiture. Grazie.

Risposte:


255

Okay l'ho trovato, devo solo usare il animateAlongsideTransition:completion:metodo sul passato UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

Questo metodo chiamerà ogni volta che ruotiamo come didRotateFromInterfaceOrientation ?. Potete per favore condividere me il metodo che hai usato. Grazie
ask123,

2
Si lo farà. Questo è quello che faccio: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
strano

1
Grazie - aggiungerò una versione rapida come risposta per salvare le persone un po 'di tempo
DogCoffee

3
lo statusbarorientation è deprecato in iOS 9. Cos'altro è l'opzione?
Deepak Sharma,

1
@DeepakSharma Sono un po 'in ritardo alla festa, ma puoi usarlo [UIDevice currentDevice].orientation. Puoi anche reindirizzare questo in UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)o UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Spero che questo ti aiuti!
Jeff,

70

La versione rapida della risposta da strano

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

È strano perché l'ho inserito nel mio ViewController e non ha fatto printnulla nel mio registro. Immagino perché questo metodo non viene chiamato. Riesci a pensare a qualcos'altro che dovrebbe essere collegato per farlo funzionare?
Viaggio

L'ho appena aggiunto a un progetto vuoto (Universal App) e funziona benissimo senza la necessità di aggiungere nulla. Forse metti un'istruzione log all'inizio del metodo e vedi se viene chiamato. Non riesco a pensare a nulla che tu debba aggiungere. Quale iOS stai utilizzando?
DogCoffee

@ DogCoffee..non viene chiamato. Ha qualcosa a che fare con il simulatore?
Saty,

@Saty funziona anche nel simulatore - quindi ho appena controllato di nuovo. Funziona come previsto.
DogCoffee

1
lo statusbarorientation è deprecato in iOS 9. Cos'altro è l'opzione?
Deepak Sharma,

10

iOS 10.3 e Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

Perché hai bisogno di animazioni? Non riesci a controllare subito 'newCollection'?
cianuro

@cyanide per sincronizzare l'animazione con il mio
Mike Glukhov,

7

La risposta accettata in Swift 3 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

Funziona bene per me 👍


Non funziona per me su iOS 10: stampa il vecchio orientamento, non quello nuovo.
Vaddadi Kartick,

1
@VaddadiKartick perché dovresti usarelet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov l'

5

Poiché la domanda era: qual era l'equivalente di didRotateFromInterfaceOrientation

Ho pensato di contribuire con il codice seguente:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

Stavo testando su un iPhone nel simulatore, ma le mie dichiarazioni di stampa non verranno eseguite se provo a utilizzare l'iPad poiché il trattoCollezione non cambierà.

Questo è strano perché questo è esattamente ciò che Apple consiglia :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

Manca una parentesi nel secondo frammento di codice
Anton Duzenko,

Funziona su iPad dove le classi verticale e orizzontale sono regolari a schermo intero?
Deepak Sharma,

Il tuo codice non è uguale a quello di Apple, stai solo testando la classe di dimensioni verticali.
ADG,

È passato un po 'di tempo, sembra che il contenuto del link sia cambiato.
Ingegnere tecnico di New York,

3

[[UIApplication sharedApplication] statusBarOrientation]è deprecato in iOS9 devi testare contro UITraitCollection per vari dispositivi.

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

6
Solo il setter è stato deprecato. Un dipendente Apple ha pubblicato: "La lettura dell'orientamento della barra di stato non è deprecata, ma solo la scrittura è. Potrebbe essersi verificato un errore nel modo in cui abbiamo costruito l'intestazione se lo vedi sul getter." ( forum.developer.apple.com/thread/12937 )
Graham Perks,

Ma il getter non è deprecato. Secondo la documentazione lo è.
Groot

0

Sull'iPad non ci sono cambiamenti nella raccolta dei tratti, quindi ecco come si rileva la rotazione dall'inizio e del completamento. Ecco la sintassi di Swift 5:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.