Métodos de rotação descontinuados, equivalente a 'didRotateFromInterfaceOrientation'?


137

Estou tentando implementar o novo viewWillTransitionToSizemétodo que foi introduzido no iOS 8 (todos os outros métodos de rotação foram preteridos). Eu gostaria de saber qual é o equivalente adidRotateFromInterfaceOrientation agora, pois há várias tarefas de limpeza que precisamos executar e não consigo ver um bloco ao qual podemos atribuir UIViewControllerTransitionCoordinatorpara ser chamado quando 'transição' para um novo tamanho termina. Obrigado.

Respostas:


255

Ok, encontrei, só tenho que usar o animateAlongsideTransition:completion:método no passado 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];
}

Esse método será chamado toda vez que girarmos como didRotateFromInterfaceOrientation ?. Você pode me compartilhar o método que você usou. Obrigado
ask123

2
Sim vai. Isto é o que eu faço: - (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]; }
estranha

1
Graças - vou acrescentar uma versão rápida como uma resposta para salvar as pessoas algum tempo
DogCoffee

3
A barra de status está obsoleta no iOS 9. O que mais é a opção?
Deepak Sharma

1
@DeepakSharma Estou um pouco atrasado para a festa, mas você pode usar [UIDevice currentDevice].orientation. Você também pode canalizar isso para UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)ou UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Espero que isto ajude!
21417 Jeff

70

A versão rápida da resposta por estranho

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

É estranho, porque eu coloquei isso no meu ViewController, e não fez printnada no meu log. Eu acho que porque este método não está sendo chamado. Você pode pensar em mais alguma coisa que precisaria ser conectada para que isso funcionasse?
Trip

Acabei de adicioná-lo a um projeto vazio (Universal App) e funciona bem sem a necessidade de adicionar nada. Talvez coloque uma declaração de log no início do método e veja se está sendo chamada. Não consigo pensar em nada que você precise adicionar. Qual iOS você está executando?
DogCoffee

@ DogCoffee..it não está sendo chamado. Tem algo a ver com o Simulator?
Saty

O @Saty também funciona no simulador - apenas verificado novamente. Funciona como esperado.
DogCoffee

1
A barra de status está obsoleta no iOS 9. O que mais é a opção?
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)
    }

Por que você precisa de animação? Você não pode verificar 'newCollection' imediatamente?
cianeto

@cyanide para sincronizar animação com o meu #
Mike Glukhov

7

A resposta aceita no 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)
}

Funciona bem para mim 👍


Não funciona para mim no iOS 10 - ele imprime a orientação antiga, não a nova.
Vaddadi Kartick 31/03

1
@VaddadiKartick porque você deve usarlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov 11/11

5

Como a pergunta era: qual era o equivalente a didRotateFromInterfaceOrientation

Pensei em contribuir com o código abaixo:

@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

Eu estava testando em um iPhone no simulador, mas minhas declarações de impressão não serão executadas se eu testar usando o iPad, pois a coleção de características não será alterada.

Isso é estranho, porque é exatamente isso que a Apple recomenda :

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

Há um suporte faltando no segundo trecho de código
Anton Duzenko

Isso funciona no iPad, onde as classes vertical e horizontal são regulares em tela cheia?
Deepak Sharma

Seu código não é o mesmo da Apple, você está testando apenas a classe de tamanho vertical.
ADG

Já faz um tempo, parece que o conteúdo do link mudou.
NYC Tech Engineer

3

[[UIApplication sharedApplication] statusBarOrientation]está obsoleto no iOS9, você deve testar o UITraitCollection para vários dispositivos.

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

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

6
Somente o setter foi preterido. Um funcionário da Apple postou: "A leitura da orientação da barra de status não está obsoleta, apenas está escrita nela. Isso pode ter sido um erro na maneira como construímos o cabeçalho, se você estiver vendo isso no getter". ( forums.developer.apple.com/thread/12937 )
Graham Perks

O getter também não está obsoleto. De acordo com a documentação é.
Groot

0

No Ipad, não há alteração na coleção de características, e aqui está como você detecta a rotação desde o início e a conclusão. Aqui está a sintaxe do 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")


    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.