Girar la rueda según el desplazamiento en un UIScrollView

Estoy tratando de hacer que una rueda gire sin problemas en función del desplazamiento de un UIScrollView. Me gustaría que se relajara cuando casi deja de desplazarse por la vista de desplazamiento.

Intenté mucho pero fallé hasta ahora, mi código actual es este:

#pragma mark - Scrollview delegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    NSLog(@"Offset: %@ Page: %i", NSStringFromCGPoint(scrollView.contentOffset), page);

    UIImageView* leftWheelImageView = (UIImageView*)[self.carImageView viewWithTag:10];

    // Calculate speed of scrolling and turn the wheels to it
    CGPoint currentOffset = scrollView.contentOffset;
    NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];

    if(lastTime - currentTime > 0.1) {
        CGFloat distance = currentOffset.x - lastOffset.x;
        CGFloat scrollSpeedNotAbs = (distance * 10) / 1000; //in pixels per millisecond        
        CGFloat scrollSpeed = fabsf(scrollSpeedNotAbs);

        leftWheelImageView.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(2*3.14*99));
        NSLog(@"Rotate wheel");
    }

    lastOffset = currentOffset;
    lastTime = currentTime;
}

¿Alguien podría empujarme en la dirección correcta :-)?

preguntado el 03 de julio de 12 a las 11:07

que tal usar scrollViewDidEndDecelerating ? -

bueno, puedo obtener una velocidad en el método didscroll... Estaba pensando en basar mi rotación en esto. tal vez si tienes algunos fragmentos podría ver lo que quieres decir exactamente -

Hay una buena biblioteca que podría sugerirle, que creo que haría que su problema fuera mucho más fácil, creo. -

¿El usuario se desplazará por la vista de desplazamiento o se automatizará? (es decir, predecible). -

Tiene que ser capaz de hacer ambas cosas:

2 Respuestas

Está configurando su compensación y tiempo incorrectamente; como están las cosas, lastOffset y lastTime se están cambiando a currentOffset y currentTime cada vez que recibe el mensaje didScroll. Entonces, su declaración if solo se activará si hay más de .1 segundos entre cada mensaje. Dado que dijo que quería que su desplazamiento fuera suave, parece poco probable que esto sea lo que pretendía. ¿Quizás mover sus asignaciones dentro de su declaración if? Veré si puedo encontrar otro método para que lo uses.

Respondido 03 Jul 12, 13:07

¿Por qué no usas la biblioteca para hacer esto? He hecho esto usando la biblioteca carrusel. Consulte el siguiente enlace https://github.com/nicklockwood/iCarousel esto es fácil y mejor de implementar.

Respondido el 14 de enero de 13 a las 11:01

Sería mejor utilizar la inercia del sistema nativo de UIScrollView. - Zelko

Sí, en cualquier momento es mejor usar la función nativa, pero acabo de sugerir una forma de hacerlo. - V-Xtremo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.