2012-07-27 83 views
4

在我的TestApp中,我創建了一個類「Carousel」,它應該讓我用簡單的方法創建一個帶有UIPageControl的輕掃菜單(通過簡單地創建一個Carousel類的實例)。UIPageControl沒有正確反應水龍頭

  • 旋轉木馬是UIView的
  • 在初始化的子類,它創建了一個UIView的,含有的UIScrollView,UIPageControl
  • 我可以添加更多UIViews滾動視圖

我不知道如果這是做到這一點的正確方法,但我的示例在我的TestApp中工作得很好。在頁面之間滑動完美,並且UIPageControl中當前頁面的顯示是正確的。

如果沒有一個單一的問題:UIPageControl有時會對點擊/點擊作出反應(我只在模擬器中測試過!),有時它不會。讓我們說大部分時間沒有。我無法找出然而,當這樣做,對我來說這只是隨機...

正如你可以看到下面,我添加

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

我的代碼。我認爲這會做適當的水龍頭處理?但不幸的是,pageChange並不總是被調用(所以每次點擊時UIPageControl的值都不會改變)。

我將不勝感激任何輸入,因爲我找不到任何解決方案呢。

這是我到目前爲止有:

Carousel.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 

Carousel.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(某處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)]; 

回答

3

您的代碼是正確的。最有可能你的pageControl的框架非常小,所以沒有很多地方尋找觸摸事件。您需要增加高度pageControl的大小,以確保在任何時候都能識別出水龍頭。

+0

我已經閱讀過關於這方面的內容,但是你認爲我的身高還不夠嗎?爲了更好地理解,我在第一篇文章的末尾添加了創建代碼。 – andreas 2012-07-27 18:02:18

+0

除了創建它的地方外,該代碼沒有提及「pageControl」。你可以確定的另一件事是它是最前面的控制。 – WrightsCS 2012-07-27 18:03:46

+0

我做了一些測試,這裏有一個非常奇怪的事情:當我向pageControl添加背景色時,它可以工作。 [UIColor clearColor]不能使其工作。目前沒有任何背景,也不是主要觀點。咄? – andreas 2012-07-27 18:12:45