Así, UITableView apoya esencialmente «infinito» de desplazamiento. No’ puede ser un límite, pero que tonto puede desplazarse para looonnnggg tiempo. Me gustaría imitar este comportamiento con un UIScrollView pero hay dos impedimentos fundamentales:

1) scrollView.contentSize se fija en el momento de la creación.
2) el zoom puede volar a cualquier carga diferida esquema de todos al infierno, ya que puede causar infinte explosión de datos.

Tienen otros reflexionado sobre esta idea? Yah, lo sé, esencialmente estamos hablando de re-creación de los Mapas de Google aquí. Cualquier conocimiento sería muy apreciada.

Saludos,
Doug

  • Has mirado en MapKit?
  • bien UITableView es una subclase de UIScrollView
InformationsquelleAutor dugla | 2009-09-29

5 Comentarios

  1. 10

    Mientras que es imposible tener un verdadero infinito UIScrollView, hay algunos trucos simples que usted puede utilizar para emular ese comportamiento.

    1. El manejo de la fija contentSize: tienen algunos de tamaño fijo la vista manejado por su desplazamiento de la vista, y en el lanzamiento o la creación de instancias, establecer el contenido de desplazamiento de modo que usted está viendo la media del tratamiento de la vista. Ver el contenido de offset (mediante el KVO o algún otro método), y si cerca de cualquiera de los bordes, actualizar el contenido de la vista con un nuevo conjunto de contenidos (offset adecuadamente) y restablecer el desplazamiento de la vista contentOffset de la propiedad de volver a estar en el medio.
    2. Manejo de zoom: hacer algo similar, sólo que esta vez de ver el factor de zoom en la vista de desplazamiento. Cuando se llega a un cierto punto, hacer algún tipo de manipulación a cualquier dato que estamos presentando para que aparezca el zoom, luego reiniciar el factor de zoom a 1.0. Por ejemplo, si usted es el desplazamiento de una imagen y se hace zoom a aparecer dos veces tan grande, programación de aplicar algún tipo de transformación para hacer que la imagen del doble del tamaño, a continuación, restablecer el desplazamiento de la vista del factor de zoom a 1.0. La imagen aparecerá ampliada, pero el desplazamiento de la vista será capaz de continuar con el zoom más según sea necesario. (Google Maps lleva esto un paso más allá de donde perezoso-cargas vistas más detalladas como el usuario zoom – usted puede o no puede elegir implementar esto.)
    • Aquí hay un enlace iphonedevelopment.blogspot.com/2009/02/kvo-and-iphone-sdk.html explicando KVO para alguien que no sabe lo que es. Como yo no.
    • El problema con esta solución es que setContentOffset cancela cualquier desplazamiento que está teniendo lugar & movimiento de repente se detiene. No conozco una forma para determinar la velocidad de la vista se estaba moviendo, o cómo reiniciar de que el movimiento se si lo hice.
    • Pero ¿por qué molestarse en cambiar el contenido de compensar a todos? Dejar de desplazamiento, sólo asegúrese de mantener y mover la imagen de las vistas corresponden a lo que el usuario está viendo.
    • Parece setContentOffset:animated: cancela la corriente de desplazamiento, pero no setContentOffset:… Primordial setContentOffset: en un descendiente de UIScrollView y el ajuste de desplazamiento funciona ! (al menos en iOS SDK 4.3)
  2. 13

    Acabo de terminar la implementación de la infitine de desplazamiento para mí.
    En mi Aplicación tengo UITableViewCell con un scrollView y Navigationbuttons. El scrollView contiene x puntos de vista de todos con la misma anchura. las vistas son alined horizontalmente y habilitar la paginación.

    scrollView.clipsToBounds = YES;
    scrollView.scrollEnabled = YES;
    scrollView.pagingEnabled = YES;
    scrollView.showsHorizontalScrollIndicator = NO;

    Mi codelogic es como el siguiente:

    1. En mi función de inicialización yo
      • crear todas las vistas (para el scrollview) y
      • poner en una matriz y
      • agregarlos a la scrollView
    2. Entonces yo llamo a una función que calcula en un bucle de las posiciones para cada vista (cada vez que se detecta un desplazamiento esta función tendrá que ser llamado también). Siempre toma el primer elemento de la matriz y establece el marco para (0,0,…,…), la segunda con (i*ancho de,0,….,….) y así sucesivamente. La función que están llamados parece a esto:

      - (void)updateOffsetsOfViews{
          int xpos = 0;
          for (int i=0; i<[views count]; i++) {
              UIImageView *_view = [views objectAtIndex:i];
              CGRect aFrame = _view.frame;
              aFrame.origin.x = xpos;
              aFrame.origin.y = 0.0;
              _view.frame = aFrame;
              xpos += viewWidth;
          }
          float center = 0;
          if(fmod([views count],2) == 1){
              center = viewWidth * ([views count]-1)/2;
          }else {
              center = viewWidth * [views count]/2;
          }
          [scrollView setContentOffset:CGPointMake(center, 0)];
          lastOffset = center;
      }
    3. Entonces (todavía en el proceso de inicialización) puedo añadir un observador

      [scrollView addObserver:self forKeyPath:@"contentOffset" options:0 context:nil];

      por lo que cada vez que algo en el scrollView cambios me sale el (observeValueForKeyPath)-función de llamada, que se parece a esto:

      - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object  change:(NSDictionary *)change context:(void *)context
      {
          UIImageView *_viewFirst = (UIImageView *)[views objectAtIndex:0];
          if ( fmod([scrollView contentOffset].x,viewWidth)  == 0.0) {
              if ([scrollView contentOffset].x > lastOffset) {
                  [views removeObjectAtIndex:0];
                  [views addObject:_viewFirst];                
                  [self updateOffsetsOfViews];    
              }else if ([scrollView contentOffset].x < lastOffset) {
                  UIImageView *_viewLast = (UIImageView *)[views lastObject];
                  [views removeLastObject];
                  [views insertObject:_viewLast atIndex:0];            
                  [self updateOffsetsOfViews];
              }
          }
      }
    4. Y en dealloc o viewDidUnload (depende de cómo se implemente) no te olvides de quitar el observador.

      [scrollView removeObserver:self forKeyPath:@"contentOffset"];   

    Espero que esto ayude, usted puede notar que algunos de arriba, pero en mi implementación yo también apoyo como el desplazamiento 5 páginas (bueno… ilimitado) a la vez y autoanimated de desplazamiento, etc. así que usted puede ver algo que podría ser arrojadas a la basura.

    • Muy buena solución, pero no hacer de punto flotante de comparaciones utilizando ==, se va a romper.
    • He probado tu código. Pero cuando me desplazarse rápidamente a las 2 de la página, El código no se manejar correctamente.
  3. 2

    Tener en cuenta que cuando el desplazamiento es de animación, contentOffset cambios muchas veces, no sólo la página por página, pero con cada paso de la animación.

  4. 0

    Quizás configuración contentSize a algunos gigantesco valor y, a continuación, mover un número limitado de puntos de vista en torno a la pista de la posición de la vista como en el Mosaico de la muestra va a hacer el truco.

    Para mitigar la posibilidad de alcanzar finalmente un borde y tener que abruptamente volver a centrar la vista (que cancela cualquier desplazamiento en la actualidad en movimiento), la vista puede ser recentered cuando está parado, de vez en cuando.

    De todos modos, eso es lo que yo voy a intentar.

    • Esto parece funcionar bien, para su INFORMACIÓN. Estoy usando 4 figura vistas del mismo tamaño que la que contiene punto de vista de que mes de marzo, junto con el desplazamiento. He basado mi código en la (mitad superior de la) Desplazamiento de la muestra.
    • El oficial de Apple infinito scroll proyecto de ejemplo que se sugiere el uso de este método.

Dejar respuesta

Please enter your comment!
Please enter your name here