Recebendo orientação do dispositivo antes de girar ou forçando-o no lançamento. Alguma ideia?

StackOverflow https://stackoverflow.com/questions/1638690

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho um prazo breve e eu tenho bug muito chato na minha frente e sem ideias, como corrigi-lo. O problema é que às vezes dispositivo não sabe o que é orientação é antes de ter sido rodado e por isso mexe-se quadros em declarações condicionais:

 if (orient == UIInterfaceOrientationPortrait || orient == 0){ 
  r = CGRectMake(0.0, 0.0, 320.0, 480.0);
        // draw stuff
    } else {
  r = CGRectMake(0.0, 0.0, 480.0, 320.0);
        // draw stuff
    }

Este bug pode ser facilmente reproduzida se eu continuar dispositivo na mesa ou nas mãos (posição horizontal) e executar o aplicativo, ele desenha paisagem semelhante retângulos na tela tipo retrato.

As minhas perguntas são: posso de alguma forma obter a orientação certa neste tipo de situação? Pena que não pode ser reproduzido em simulador, então eu não tenho certeza se o código que eu colado é responsável por este erro, mas esse é o lugar onde eu fixar quadros vista de acordo com a orientação. Talvez haja outra maneira (correta) para fazer isso? E talvez eu possa forçar aplicativo para estar no modo retrato, até eventos rotação será demitido?

Foi útil?

Solução

Eu não acho que isso é um erro. Quando o iPhone está sentado na mesa toda a gravidade é meassured ao longo do eixo Z. Para determinar a orientação do dispositivo eixo X-Y são usados, mas sem aceleração é medida ao lado deles em seu cenário.

EDIT: Mais explicações:

Esta imagem mostra como o Axis são orientados sobre o iPhone: http://developer.apple. com / iphone / biblioteca / documentação / UIKit / Referência / UIAcceleration_Class / Arte / device_axes.jpg

Então, quando você tem o iPhone deitado de costas, uma aceleração de -1g é aplicado no eixo z. Para receber as acelerações medidas simplesmente registrar um UIAccelerometerDelegate delegado implementação com a instância UIAccelerometershared. Veja a AccelerometerGraph exemplo de como isso é feito.

Para determinar se o iphone se senta na mesa de fazer algo parecido com isto:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
    {

    // lowPass filter first

    // now choose orientation
      if (fabs([acceleration z]) >= 0.9) // sitting on the table: choose new mode or lock current mode
      if (fabs([acceleration y]) >= 0.9) // probably portrait mode
      if (fabs([acceleration x]) >= 0.9) // probably landscape mode

    }

A precisão acelerômetro é 18mG = 0.018G modo que ter em conta. Também é preciso isolar-se os efeitos das mudanças de movimento instantâneo, filtro de um simples LowPass se encaixa nesse projeto perfeitamente. Os shows amostra AccelerometerGraph como implementar esse filtro.

Além disso, escolha um nível muito baixo updateInterval se você não precisa de muita precisão, 30Hz deve estar bem para seus propósitos.

Outras dicas

O sensor, que determina a orientação do dispositivo é nem infalíveis nem inteligente. Se você definir o telefone para baixo sobre a mesa e, em seguida, andar em torno dele, como é que é suposto saber que é de cabeça para baixo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top