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 が呼び出されます。
詳しくは:
- PagingEnabled が NO に設定されている場合、これは発生しません。
スクロールが手動で行われなかったにもかかわらず、この scrollViewDidScroll イベントが呼び出されるのはなぜですか? イベントハンドラーscrollViewWillBeginDraggingもこの時に呼び出される?
更新 1:
実際の問題は、PagingEnabled が YES の場合、スクロール ビューのデリゲートが設定されているかどうかに関係なく、ケース 2 では、スクロール ビューが自動的に前のページにスクロールすることです。