4

scrollViewページコントロールの作成方法に関するチュートリアルに従いました:http ://www.iosdevnotes.com/2011/03/uiscrollview-paging/

このチュートリアルは本当に良いです、そして私はコードをうまく実装します。ここに私の質問:

PageViewの間にスペースを入れたいのですが、ページを変更すると、次のページのビューの間にスペースが表示されます。ページを変更するときは、スペースの後でスクロールを停止する必要があります。

ここでチュートリアルコードを変更しました:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];

    #define space 20

    for (int i = 0; i < colors.count; i++) {
        CGRect frame;
        frame.origin.x = (self.scrollView.frame.size.width + space) * i;
        frame.origin.y = 0;
        frame.size = self.scrollView.frame.

        UIView *subview = [[UIView alloc] initWithFrame:frame];
        subview.backgroundColor = [colors objectAtIndex:i];
        [self.scrollView addSubview:subview];
        [subview release];
    }

    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * colors.count+ space*(colors.count-1), self.scrollView.frame.size.height);
}
4

2 に答える 2

9

ページ間に「ガター」が必要なようです。これにより、各ページがスクロールビューに表示され、ユーザーがビューをドラッグしている間のみガターが表示されます。たとえば、組み込みの写真アプリがこれを行います。

スクロールビューをspaceポイントごとに広げます。たとえば、スクロールビューを画面と同じ幅(320ポイント)で、アイテム間に20ポイントのマージンを持たせたい場合は、スクロールビューを340ポイント幅にし、余分な20ポイントを右端からぶら下げます。画面の。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];

    #define kGutterWidth 20

    UIScrollView *scrollView = self.scrollView;
    CGRect scrollViewFrame = scrollView.frame;
    scrollViewFrame.size.width += kGutterWidth;
    scrollView.frame = scrollViewFrame;

    CGSize scrollViewSize = scrollView.bounds.size;

    for (int i = 0; i < colors.count; i++) {
        CGRect frame = CGRectMake(scrollViewSize.width * i, 0,
            scrollViewSize.width - kGutterWidth, scrollViewSize.height);
        UIView *subview = [[UIView alloc] initWithFrame:frame];
        subview.backgroundColor = [colors objectAtIndex:i];
        [scrollView addSubview:subview];
        [subview release];
    }

    scrollView.contentSize = CGSizeMake(
        colors.count * scrollViewSize.width,
        scrollViewSize.height);
}
于 2012-09-11T03:07:17.217 に答える
2

私は以前にこの道を進んだことがあります。チュートリアルコードが推奨するように、サブビューの間にスペースを入れずにスクロールビューをレイアウトすることをお勧めします。

代わりに、各サブビューに、その親からフレームがはめ込まれている別のサブビューを与えます...

CGRect scrollViewFrame = self.scrollView.frame;

for (int i=0; i<colors.count; i++) {
    CGRect frame = CGRectMake(scrollViewFrame.size.width * i, 0, scrollViewFrame.size.width, scrollViewFrame.size.height);

    // this will be our framing view, full size with no gaps
    UIView *subview = [[UIView alloc] initWithFrame:frame];
    subview.backgroundColor = [UIColor whiteColor];

    // here's the trick - use CGRectInset on the framing view's bounds
    UIView *colorView = [[UIView alloc] initWithFrame:CGRectInset(subview.bounds, 10, 10)];
    colorView.backgroundColor = [colors objectAtIndex:i];

    [subview addSubview:colorView];
    [self.scrollView addSubview:subview];

    // aren't you using ARC?  your tutorial is probably older than ARC
    // would strongly suggest converting to ARC
    [subview release];
    [colorView release];
}
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * colors.count, self.scrollView.frame.size.height);

このアプローチの利点は、トップレベルのサブビューレイアウトの計算が幅の単純な倍数のままであるということです。そのインセット定数を参照する唯一の場所は、それが属するCGRectInsetです。

于 2012-09-11T03:01:57.550 に答える