2

UIScrollView を使用して、多くのサブビューを表示しています。以下は、スクロール ビューを作成するためのコードです。

ScrollView = [[UIScrollView alloc]initWithFrame:CGRectZero];
ScrollView.delegate = self;
ScrollView.showsHorizontalScrollIndicator = NO;
ScrollView.showsVerticalScrollIndicator = NO;
ScrollView.clipsToBounds = YES;
ScrollView.scrollEnabled = YES;
ScrollView.pagingEnabled = YES;

CGFloat widthOfScroll= (maxTotalColumnsVisibleAtAnyPoint * widthOfSubView );

ScrollView.frame = CGRectMake(0, 0, widthOfScroll, heightOfSubView);

CGSize contentSizeHeaderView =  self.ScrollView.frame.size;
CGFloat contentSizeWidth =  self.totalSubViews * self.widthOfSubView;
contentSizeHeaderView.width =  contentSizeWidth;

[ScrollView setContentSize:contentSizeHeaderView];

コントロールを ScrollView に追加するためのコードと、scrollView のイベント ハンドラーを以下に示します。

-(void)loadControlsInScroll{


    UIView *tempSubView = nil;
    CGFloat tempOriginX = 0;
    @autoreleasepool {


        for (int i = 0; i < self.totalSubViews; i++) {


            tempSubView = [dataSource viewForScroll:i];
            tempSubView.layer.borderColor = borderColor.CGColor;
            tempSubView.layer.borderWidth = kBorderWidth;
            tempSubView.frame = CGRectMake(tempOriginX, 0, widthOfSubView, heightOfSubView);
            tempOriginX = tempOriginX + widthOfSubView;

            [self.ScrollView addSubview:tempSubView];
        }

    }

}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
///Event handler
}

このスクロール ビューでページングを有効にしました。

最大で scrollView がそのフレームに 8 つのサブビューを保持できると仮定しましょう。

ケース 1:

スクロールビューに 16 個のサブビューが追加されます。これで 2 ページが表示されます。両方のページへのスクロールは正しく機能しています。両方のページでサブビューに触れても、不正な動作は発生しません。

ケース 2:

スクロール ビューに 9 つのサブビューが追加されます。今も2ページです。最初のページには、1 ~ 8 番目のサブビューが含まれます。ページ 2 には、2 番目から 9 番目のサブビューが含まれています。ページ 1 のサブビューをタッチしても正常に動作するようになりました。ページ 2 でタッチすると、UIScrollView のイベント ハンドラ scrollViewDidScroll が呼び出されます。

ここに画像の説明を入力 ここに画像の説明を入力

詳しくは:

  1. PagingEnabled が NO に設定されている場合、これは発生しません。

スクロールが手動で行われなかったにもかかわらず、この scrollViewDidScroll イベントが呼び出されるのはなぜですか? イベントハンドラーscrollViewWillBeginDraggingもこの時に呼び出される?

更新 1:

実際の問題は、PagingEnabled が YES の場合、スクロール ビューのデリゲートが設定されているかどうかに関係なく、ケース 2 では、スクロール ビューが自動的に前のページにスクロールすることです。

4

1 に答える 1