5

ScrollView の無限ページングについて質問があります。私のアプリでは、ScrollView に 3 つのサブビューしかありません。各サブビューは xib ファイルからロードされます。通常、ScrollView では ABC のように見えます。無限ページングを作りたかったので、エンドキャップを追加し、CABCA のようになりました。ユーザーが最初の C にいる場合は通常の C にジャンプし、ユーザーが最後の A にいる場合は通常の A にジャンプします。コードは次のとおりです。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender {

  if (scrollView.contentOffset.x == 0)
  {
      [scrollView scrollRectToVisible:CGRectMake
      ((scrollView.frame.size.width * 3), 0,
      scrollView.frame.size.width,
      scrollView.frame.size.height) animated:NO];
  } 
  else if (scrollView.contentOffset.x == scrollView.frame.size.width * 4)
  {
     [scrollView scrollRectToVisible:CGRectMake
     (scrollView.frame.size.width, 0,
      scrollView.frame.size.width,
      scrollView.frame.size.height) animated:NO];
   }
}

今では完全に機能します。しかし、サブビューごとに ViewController があり、これが ScrollView に追加する方法です。

  subViewController1 = [[SubViewController1 alloc] initWithNibName:@"SubView" bundle:nil];
  subViewController1.view.frame =
    CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height);
  [scrollView addSubview:subViewController1.view];

問題は、A ビューと C ビューの複製が 1 つあるため、3 つではなく 5 つのコントローラーがあることです。また、A ビューに何かを追加したい場合は、A ビューの複製にも追加する必要があります。

ビュー A と A の複製を 1 つのコントローラーで制御して、1 つのコントローラーの 2 つのインスタンスを作成する必要がないようにする方法はありますか? ありがとうございました。

4

1 に答える 1

15

さらに良いことに、ビュー A とビュー C を複製する必要はありませ- (void)scrollViewDidScroll:(UIScrollView *)scrollViewcontentOffset

セットアップ: おそらく、既に行っている方法と非常によく似ています。

境界幅の 3 倍になるUIScrollViewように設定します。contentSizeページングがオンになっており、バウンスがオフになっていることを確認してください。

ABC サブビューを UIScrollView に左から右に追加します。

また、ViewControllerにABC_contentViews を含む配列を呼び出します。UIViews

次に、コンテンツ オフセットをリセットし、スクロールビューが端に到達すると同時にサブビューを移動するこれを実装します。

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

    if(scrollView.contentOffset.x == 0) {
        CGPoint newOffset = CGPointMake(scrollView.bounds.size.width+scrollView.contentOffset.x, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsRight];
    }
    else if(scrollView.contentOffset.x == scrollView.bounds.size.width*2) {
        CGPoint newOffset = CGPointMake(scrollView.contentOffset.x-scrollView.bounds.size.width, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsLeft];
    }
}

-(void)rotateViewsRight {
    UIView *endView = [_contentViews lastObject];
    [_contentViews removeLastObject];
    [_contentViews insertObject:endView atIndex:0];
    [self setContentViewFrames];

}

-(void)rotateViewsLeft {
    UIView *endView = _contentViews[0];
    [_contentViews removeObjectAtIndex:0];
    [_contentViews addObject:endView];
    [self setContentViewFrames];

}

-(void) setContentViewFrames {
    for(int i = 0; i < 3; i++) {
        UIView * view = _contentViews[i];
        [view setFrame:CGRectMake(self.view.bounds.size.width*i, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    }
}
于 2013-05-28T10:50:24.720 に答える