UIPageControl no reacciona correctamente a los toques

En mi TestApp, creé una clase "Carrusel" que debería permitirme crear un menú deslizante con un UIPageControl de una manera fácil (simplemente creando una instancia de la clase Carrusel).

  • Carrusel es una subclase de UIView
  • Al inicio, crea una UIView que contiene UIScrollView, UIPageControl
  • Puedo agregar más UIViews a la vista de desplazamiento

No sé si esta es la forma correcta de hacerlo, pero mi ejemplo funcionó bastante bien en mi TestApp. Deslizar entre páginas funciona perfectamente y la visualización de la página actual en UIPageControl es correcta.

Si no hubiera un solo problema: el UIPageControl a veces reacciona a los clics/toques (¡hasta ahora solo probé en Simulator!), a veces no. Digamos que la mayoría de las veces no lo hace. Todavía no pude averiguar cuándo lo hace, para mí es solo aleatorio ...

Como puede ver a continuación, agregué

[pageControl addTarget:self action:@selector(pageChange:) forControlEvents:UIControlEventValueChanged];

a mi código. Pensé que esto haría el manejo adecuado de los grifos. Pero desafortunadamente, pageChange no siempre se llama (por lo que el valor de UIPageControl no cambia cada vez que hago clic).

Agradecería cualquier aporte sobre esto porque aún no pude encontrar ninguna solución.

Esto es lo que tengo hasta ahora:

Carrusel.h

#import <UIKit/UIKit.h>

@interface Carousel : UIView {
    UIScrollView *scrollView;
    UIPageControl *pageControl;
    BOOL pageControlBeingUsed;
}

- (void)addView:(UIView *)view;
- (void)setTotalPages:(NSUInteger)pages;
- (void)setCurrentPage:(NSUInteger)current;
- (void)createPageControlAt:(CGRect)cg;
- (void)createScrollViewAt:(CGRect)cg;

@end

Carrusel.m

#import "Carousel.h"

@implementation Carousel

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];

    if (self) {

        // Create a scroll view
        scrollView = [[UIScrollView alloc] init];
        [self addSubview:scrollView];

        scrollView.delegate = (id) self;

        // Init Page Control
        pageControl = [[UIPageControl alloc] init];
        [pageControl addTarget:self action:@selector(pageChange:) forControlEvents:UIControlEventValueChanged];
        [self addSubview:pageControl];

    }

    return self;

}

- (IBAction)pageChange:(id)sender {
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * pageControl.currentPage;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:TRUE];
    NSLog(@"%i", pageControl.currentPage);
}

- (void)addView:(UIView *)view {
    [scrollView addSubview:view];
}

- (void)createPageControlAt:(CGRect)cg {
    pageControl.frame = cg;
}

- (void)setTotalPages:(NSUInteger)pages {
    pageControl.numberOfPages = pages;
}

- (void)setCurrentPage:(NSUInteger)current {
    pageControl.currentPage = current;
}

- (void)createScrollViewAt:(CGRect)cg {
    [scrollView setPagingEnabled:TRUE];
    scrollView.frame = cg;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width*pageControl.numberOfPages, scrollView.frame.size.height);
    [scrollView setShowsHorizontalScrollIndicator:FALSE];
    [scrollView setShowsVerticalScrollIndicator:FALSE];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    float frac = scrollView.contentOffset.x / scrollView.frame.size.width;
    NSUInteger page = lround(frac);
    pageControl.currentPage = page;

}

@end

ViewController.m (en algún lugar de viewDidLoad)

Carousel *carousel = [[Carousel alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];

for (int i=0; i<5; i++) {
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i * 320, 0, 320, 420)];
    UIColor *color;
    if(i%3==0) color = [UIColor blueColor];
    else if(i%3==1) color = [UIColor redColor];
    else color = [UIColor purpleColor];
    view.backgroundColor = color;
    [carousel addView:view];
    view = nil;
}

[carousel setTotalPages:5];
[carousel setCurrentPage:0];

[carousel createPageControlAt:CGRectMake(0,420,320,40)];
[carousel createScrollViewAt:CGRectMake(0,0,320,420)];

preguntado el 27 de julio de 12 a las 18:07

1 Respuestas

Su código es correcto. Lo más probable es que el marco de su pageControl es bastante pequeño, por lo que no hay mucha área para buscar eventos táctiles. Tendrías que aumentar el tamaño de la altura of pageControl para asegurarse de que los toques se reconozcan todo el tiempo.

Respondido 27 Jul 12, 18:07

He leído sobre eso, pero ¿no crees que mi altura es suficiente? Para una mejor comprensión, agregué el código para la creación al final de mi primera publicación. - andreas

Ese código no dice nada sobre pageControl excepto donde lo estás creando. Otra cosa de la que puede asegurarse es que es el control más frontal. - wrightscs

Hice algunas pruebas y aquí hay algo muy extraño: cuando agrego un color de fondo al control de página, funciona. [UIColor clearColor] no lo hace funcionar. No hay ningún fondo configurado en este momento, tampoco para la vista principal. ¿Eh? - andreas

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