Estoy construyendo una costumbre de la máquina de ranura con una columna que existe de un uitableview.

Cuando el usuario tira de una palanca el formato tableview debe desplazarse a una posición determinada con un índice.
He utilizado el método:

- scrollToRowAtIndexPath:atScrollPosition:animated:

Pero este método hará que la tabla de desplazamiento con una constante de tiempo de duración. Así que usted realmente no reconocer una larga o corta tirada.

Estoy buscando una manera de:
A) disminuir el desplazamiento de la animación. O,
B) Cambiar la duración de la animación de desplazamiento a un mismo valor definido.

El normal desplazamiento de animación (con el dedo) no muestran este efecto.
Tal vez es una idea estúpida, pero es una idea para invocar un touchesBegan y touchesDidEnd método en mi en formato tableview?

Gracias ya

  • nada de esto?

8 Comentarios

  1. 13

    Porque un UITableView hereda de UIScrollView también se pueden utilizar setContentOffset:animación:
    De esta manera usted puede hacer que su formato tableview «desplazamiento» de una cierta cantidad de píxeles de su elección para cualquier lado que te gusta.

    Esto se puede hacer lo mismo con el scrollToRowAtIndexPath:atScrollPosition:animación:

    Hice un prototipo sólo para mostrar cómo funciona.

    Debido a que se realiza con los temporizadores y las cosas que usted puede establecer el tiempo de desplazamiento automático va a durar y qué tan rápido (y en qué medida, si usted está utilizando el contentoffset) la animación se vaya.

    Este es el .h archivo:

    #import <UIKit/UIKit.h>
    
    @interface AutomaticTableViewScrollViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>
    {
        UITableView *slotMachine;
        NSMutableArray *listOfItems;
        NSTimer *tableTimer;
    }
    
    @property (nonatomic,retain) UITableView *slotmachine;
    @property (nonatomic,retain) NSMutableArray *listOfItems;
    @property (nonatomic,retain) NSTimer *tableTimer;
    
    -(void)automaticScroll;
    -(void)stopscroll;
    
    @end

    Este es el .m de archivo:

    #import "AutomaticTableViewScrollViewController.h"
    @implementation AutomaticTableViewScrollViewController
    @synthesize slotmachine;
    @synthesize listOfItems;
    @synthesize tableTimer;
    -(void)loadView
    {
    [super loadView];
    slotmachine = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];
    slotmachine.delegate = self;
    slotmachine.dataSource = self;
    [self.view addSubview:slotmachine];
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {    
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    //Set up the cell...
    if (indexPath.row % 2 == 0) 
    {
    cell.textLabel.text = @"blalala";
    }
    return cell;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    return 99999;
    }
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    //you might want to do this action in ur buttonTargetMethod
    //start timers
    tableTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 //this value arranges the speed of the autoScroll
    target:self
    selector:@selector(automaticScroll)
    userInfo:nil
    repeats:YES];
    [NSTimer scheduledTimerWithTimeInterval:5 //this arranges the duration of the scroll
    target:self
    selector:@selector(stopscroll)
    userInfo:nil
    repeats:NO]; 
    }
    -(void)automaticScroll
    {
    [slotmachine setContentOffset:CGPointMake(slotmachine.contentOffset.x, slotmachine.contentOffset.y + 50) animated:YES]; //the 50 stands for the amount of movement every tick the timer will make
    }
    -(void)stopscroll
    {
    //stop tabletimer again
    [tableTimer invalidate];
    }
    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
    {
    return YES;
    }
    @end

    Si usted tiene alguna pregunta, siéntase libre de dejar un comentario y voy a elaborar.

  2. 17

    Puede necesitar para mirar en esa dirección?

     [UIView animateWithDuration: 1.0
    animations: ^{
    [tableViewExercises scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:previousSelectedExerciseCell inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }completion: ^(BOOL finished){
    }
    ];

    Trabajar sólo con animación:NO.

    • Para mí esto sólo workes cuando la celda de destino está en la pantalla. Cuando no lo es. Todas las células que pasan por la pantalla no será inicializado… he de 100 células. Y de desplazamiento de la primera a la 80. Cuando se empieza, todo se convierte en blanco, a continuación, 80 y más vienen en la pantalla y se detiene.
    • sí, eso es porque la animación se ejecuta en el hilo principal como el tableViewCell de la construcción. Se puede ejecutar la animación en un subproceso en segundo plano pero como usted debe saber que no es seguro para subprocesos para ejecutar la interfaz de usuario de las operaciones en un subproceso en segundo plano. Sin embargo se debe trabajar la mayoría del tiempo. (tal vez en realidad scrollToRowAtIndexPath: no es un método de interfaz de usuario directamente pero si es así, usted podría conseguir realmente extraño errores de vez en cuando y usted no va a adivinar de dónde vienen)
    • Esto funciona perfecto. Excepto un pequeño problema de diseño. Las células encima de la celda en función de la indexPath desaparecer antes de que la animación se inicia.
    • ¿cómo se puede evitar que las células de desaparecer antes de que la animación se inicia?
    • Yo no 😀 yo creo que esa es la razón por la que estoy llamando a un issie y mi comentario tiene 7 upvotes… yo, sinceramente, no tiene una solución, lo siento
  3. 3

    Si usted puede requerir iOS 5, se podría utilizar el UIScrollViewDelegate método scrollViewWillEndDragging:withVelocity:targetContentOffset:.
    Esto le permite ver, cómo de rápido que el usuario estaba moviendo el dedo, donde la desaceleración de la animación iba a terminar con la velocidad por defecto, y que permite anular la velocidad de la animación, por lo que termina en un punto diferente.

  4. 1

    la forma más común de hacer aplicaciones-slot-machines con UIPickerView tal vez usted debe comprobar esto..

  5. 1

    Acerca de cómo configurar un temporizador y, a continuación, llamar el desplazamiento cuando el temporizador incendios:

    start_index = 0;
    dest_index = 20;
    timer = [NSTimer scheduledTimerWithTimeInterval:(0.1) target:self selector:@selector(rolling) userInfo:nil repeats:YES];                
    - (void)rolling {
    start_index++;
    if (start_index < dest_index) {
    NSIndexPath *Index = [NSIndexPath indexPathForRow:start_index inSection:0];
    [self.tableView scrollToRowAtIndexPath:Index atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
    } else {
    [timer invalidate];
    }
    }
  6. 1

    He estado usando el Gorrión marco del la interpolación de características similares para las animaciones.

    El enlace de arriba tiene un ejemplo de cómo configurarlo. Usted puede animar a cualquier propiedad numérica de cualquier Objetivo C objeto, y puede utilizar las transiciones como «fácil», «facilitar», «la facilidad en la elástica», etc., o simplemente a la buena vieja lineal animaciones.

    La propiedad contentSize es un CGPoint aunque, por lo que necesitaría en realidad animar una propiedad diferente en una de sus clases y, a continuación, aplicar un método real para el establecedor de la propiedad de la función para que se actualice la contentOffset.

    - (void) setTableScrollPosition:(CGFloat)position
    {
    CGPoint newOffset = CGPointMake(0.0, position);
    scrollView.contentOffset = newOffset;
    }
    • O simplemente puede usar CAMediaTimingFunction, que yo no sabía nada hasta el día de hoy! Doh!
  7. 1

    He buscado mucho por esta respuesta, pero al final tuvo que venir para arriba con uno de los míos.
    Usted puede llamar al método scrollAutomatically con la partida número de fila como:

    [self scrollAutomatically:0];

    Así que esto es lo que la función que parecía. Yo estaba trabajando con una tabla que siempre había 3000 filas y tenía la intención de desplazarse a la parte inferior.

    - (void) scrollAutomatically:(int) i
    {
    __block int j = i;
    [UIView animateWithDuration: 0//Change this to something more for slower scrolls
    animations: ^{
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:j inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
    }
    completion: ^(BOOL finished){
    j = j + 10;//Changing this number affects speed.
    if(j<=2999)//here you could provide the index of destination row
    [self scrollAutomatically:j];
    else
    {
    //I had some code here that popped up a UIAlertView.
    }
    }];
    }

    Llegando a la velocidad de desplazamiento.

    PARA REALMENTE RÁPIDO SE DESPLAZA:

    Si puedo configurar el valor por el que me incrementar el índice de fila (j) en cada llamada de la función a 10,
    es decir, si yo escribo j = j+10; entonces mi 3000 filas tomó alrededor de 9 segundos para desplazarse. (3000 * la media de FPS que yo podría reunir).
    Si me puse a j = j+20;, a continuación, el 3000 filas tomó cerca de 4,5 segundos. Así que usted consigue la idea.
    Para que se pueda desplazar más lento reducir el valor de incremento.

    LENTO, LEGIBLE SCROLLS:

    [UIView animateWithDuration: 1.5//this will directly set your speed. n rows scrolled every 1.5 seconds.

    NOTA: Si desea cambiar los marcos de CALayers o puntos de vista (por ejemplo. un customView puede que haya agregado a la contentView de su tableViewCell), entonces estas animaciones se comienzan a molestar aquí. Para una gran animación duración, que será muy visible y puede ver extraño comportamiento de la célula.

    Que en caso de que dondequiera que usted cambie sus cuadros, etc. mira algo como:

    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
    [myView.myCALayer.frame = (CGRect){ { 10, 10 }, { 100, 100 } ];
    [CATransaction commit];

    Encontrar la solución anterior aquí.

    También tendrá que establecer las acciones diccionario de la capa para devolver valores nulos para todas las acciones.

    NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"sublayers", nil];
    superlayer.actions = newActions;

    Esto parece ser demasiado tarde, pero para las personas que enfrentan el mismo problema espero que esta respuesta va a ser útil. También por favor, siéntase libre para que me guíe en caso de que se me han hecho algunas obvio (o no tanto) error garrafal.

    Edit: Vaya, veo que la cosa exacta, por encima de mi respuesta 🙁
    De todos modos, este es un poco más detallada y yo sólo soy un principiante 🙂

  8. 0

    Usted no puede (a mi conocimiento, he estado buscando por todas partes por una forma de hacer esto) realizar una velocidad que no es constante para

    - scrollToRowAtIndexPath:atScrollPosition:animated:

    Así que sugiero… que si realmente lo necesita, hacer su propio de alguna animación o algo, o hacer algo mucho más fácil que iba a ahorrar un poco de tiempo, el uso de UIPickerView

Dejar respuesta

Please enter your comment!
Please enter your name here