Recebendo orientação do dispositivo antes de girar ou forçando-o no lançamento. Alguma ideia?
-
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?
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 UIAccelerometer
shared. 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?