Pregunta

Tengo una imageView en la vista. Se mueve incluso si el iPhone permanece quieto por algún tiempo. Por que es esto entonces ? Además, la imagen no responde rápidamente al movimiento del iphone.

Aquí está mi código escrito para esto:

También configuré updateInterval y delegué el acelerómetro.

#define kVelocityMultiplier 1000;



-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    if(currentPoint.x < 0)
    {
        currentPoint.x=0;
        ballXVelocity=0;
    }

    if(currentPoint.x > 480-sliderWidth)
    {
        currentPoint.x=480-sliderWidth;
        ballXVelocity=0;
    }
    static NSDate *lastDrawTime;
    if(currentPoint.x<=480-sliderWidth&&currentPoint.x>=0)
    {

        if(lastDrawTime!=nil)
        {
            NSTimeInterval secondsSinceLastDraw=-([lastDrawTime timeIntervalSinceNow]);
            ballXVelocity = ballXVelocity + -acceleration.y*secondsSinceLastDraw;

            CGFloat xAcceleration=secondsSinceLastDraw * ballXVelocity * kVelocityMultiplier;

            currentPoint = CGPointMake(currentPoint.x + xAcceleration, 266);
        }
        slider.frame=CGRectMake(currentPoint.x, currentPoint.y, sliderWidth, 10);
    }
    [lastDrawTime release];
    lastDrawTime=[[NSDate alloc]init];
}

¿Alguien puede ayudarme por favor?

¿Fue útil?

Solución

Noto un par de cosas en el código

  • Las dos primeras declaraciones if para tener la posición dentro de un cierto rango deben hacerse justo antes de establecer la posición del control deslizante; de ??lo contrario, puede suceder que la imagen se establezca fuera del rango preferido.

  • ballXVelocity se calcula como normalizado a partir del valor acceleration.y multiplicado por el tiempo delta. Tal vez debería considerar multiplicar ese factor en lugar de hacer el kVelocityMultiplier en la siguiente línea.

  • Como el acelerómetro es muy sensible y es difícil hacer un ajuste perfecto en la placa de circuito, nunca se obtiene un valor perfecto. En su lugar, uno debería tratar de tener alguna etapa de calibración y quizás usar solo un rango válido similar a las dos primeras declaraciones if.

Otros consejos

Puede considerar filtrar sus valores a la manera de Apple.

#define kFilteringFactor 0.15

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
accelx = acceleration.x * kFilteringFactor + accelx * (1.0 - kFilteringFactor);
accely = acceleration.y * kFilteringFactor + accely * (1.0 - kFilteringFactor);
accelz = acceleration.y * kFilteringFactor + accelz * (1.0 - kFilteringFactor);}

accelx, accely y accelz son UIAccelerometerValues.

Entonces puedes hacer algo como

ball.position.x += accelx * ballSpeed * deltaDrawingTime;

El movimiento debería ser mejor ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top