6

私の TestApp では、クラス "Carousel" を作成しました。これにより、UIPageControl を使用して簡単な方法でスワイプ メニューを作成できます (Carousel クラスのインスタンスを作成するだけです)。

  • カルーセルは UIView のサブクラスです
  • 初期化時に、UIScrollView、UIPageControl を含む UIView を作成します。
  • スクロール ビューにさらに UIView を追加できます

これが適切な方法かどうかはわかりませんが、私の例は 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

カルーセル.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)];
4

1 に答える 1

4

あなたのコードは正しいです。ほとんどの場合、フレームpageControlはかなり小さいので、タッチイベントを探すための領域はあまりありません。タップが常に認識されるようにするには、の高さのサイズを大きくする必要があります。pageControl

于 2012-07-27T17:57:24.340 に答える