2012-11-22 22 views
5

Załóżmy, że mamy dziesięć stron.Zdarzenie UIControlEventValueChanged nie jest wyzwalane dla UIPageControl konsekwentnie

obsługi zdarzeń dla zdarzenia w brzmieniu jak poniżej:

Uruchom aplikację. Teraz na dziesięciu stronach domyślnie wybierana jest strona 1 (indeks 0). Dotknij drugiej strony lub trzeciej strony. Zdarzenie nie zostanie uruchomione. Jeśli wybrana zostanie ostatnia strona, zdarzenie zostanie uruchomione. To samo dzieje się z ostatnią stroną. Po wybraniu ostatniej strony wybierz poprzednią stronę. Zdarzenie nie zostanie wyzwolone, ale jeśli wybierzesz pierwszą stronę, zdarzenie nie zostanie uruchomione.

Aby zobaczyć łatwą demonstrację tym przypadku, należy pobrać przykładowe UICatalog i otwórz ControlsViewController.m i zmienić UIControlEventTouchUpInside do UIControlEventValueChanged w linii nr 375.

- (UIPageControl *)pageControl 
{ 
    if (pageControl == nil) 
    { 
     CGRect frame = CGRectMake(120.0, 14.0, 178.0, 20.0); 
     pageControl = [[UIPageControl alloc] initWithFrame:frame]; 
     [pageControl addTarget:self action:@selector(pageAction:) forControlEvents:UIControlEventValueChanged]; 

     // in case the parent view draws with a custom color or gradient, use a transparent color 
     pageControl.backgroundColor = [UIColor grayColor]; 

     pageControl.numberOfPages = 10; // must be set or control won't draw 
     pageControl.currentPage = 0; 
     pageControl.tag = kViewTag; // tag this view for later so we can remove it from recycled table cells 
    } 
    return pageControl; 
} 

Odpowiedz

10

Możecie być nieporozumienie jak działa kontroli strona . Jest to wizualny wskaźnik liczby obecnych stron, ale dotykanie konkretnej kropki nie idzie na tę stronę. Użytkownik przesuwa tylko jedną stronę naraz, dotykając lewej połowy przesuwa stronę, a po prawej stronie przesuwa stronę.

Jeśli jesteś na pierwszej stronie, a stukniesz w lewą połowę, nie możesz cofnąć kolejnej strony, więc nic się nie dzieje.

Nie podoba mi się to zachowanie, szczególnie na iPadzie, więc zazwyczaj korzystam z podklasy lub z mojej własnej obsługi dotykowej, aby ustalić, czy lokalizacja dotykowa znajduje się po lewej lub prawej stronie aktualnie wybranej strony, i wysłać zdarzenie odpowiednio.

+0

@jrtuton: Dzięki. Kiedy testowałem aplikację na iPadzie, byłem w stanie lepiej zrozumieć tę sprawę. – Krishnan

0

Można użyć UITapGestureRecognizer zamiast korzystania addTarget: akcja samodzielne: @selector()

//Added UITapGestureRecognizer instead of using addTarget: method   
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];   
tapGesture addTarget:self action:@selector(pageAction:) ]; 
[pageControl addGestureRecognizer:tapGesture]; 
[tapGesture release]; 
tapGesture = nil; 


-(void)pageAction:(UITapGestureRecognizer *)tapGesture{ 

    UIPageControl *pageControl = (UIPageControl *)tapGesture.view;  

    NSLog(@"page Number: %d",pageControl.currentPage); 


} 
+2

Jeśli chcesz wykrywać zaczepy, znacznie łatwiej jest po prostu użyć wbudowanego uchwytu do kranu, który mają wszystkie kontrolery UIC. Na przykład: '[pageControl addTarget: self action: @selector (handleTap :) forControlEvents: UIControlEventTouchUpInside]' –