Вы можете иметь вложенные виды прокрутки, чтобы прокрутка работала в обоих направлениях.Давайте иметь вертикальный скроллер внутри горизонтального скроллера (хотя вы можете сделать это и в обратном направлении), поэтому представления 3 и 1 попадают в вертикальное представление прокрутки, которое, в свою очередь, попадает внутрь горизонтального скроллера вместе с представлением 2.
Вы можете создать такую иерархию представлений в коде (вероятно, в главном контроллере представлений viewDidLoad
).В следующем фрагменте предполагается, что view1, view2 и view3 являются веб-представлениями.
CGRect bounds = self.view.bounds;
// main guy is a horizontal scroller
UIScrollView *hScrollView = [[UIScrollView alloc] initWithFrame:bounds];
hScrollView.contentSize = CGSizeMake(bounds.size.width * 2, bounds.size.height);
hScrollView.delegate = self;
[self.view addSubview:hScrollView];
// the horizontal scroller contains a vertical scroller
UIScrollView *vScrollView = [[UIScrollView alloc] initWithFrame:bounds];
vScrollView.contentSize = CGSizeMake(bounds.size.width, bounds.size.height * 2);
vScrollView.delegate = self;
[hScrollView addSubview:vScrollView];
// add view3 and view1 to the vertical scroller
UIWebView *view3 = [[UIWebView alloc] initWithFrame:bounds];
[view3 loadHTMLString:@"<h1>3</h1>" baseURL:nil];
[vScrollView addSubview:view3];
UIWebView *view1 = [[UIWebView alloc] initWithFrame:CGRectOffset(bounds, 0, bounds.size.height)];
[view1 loadHTMLString:@"<h1>1</h1>" baseURL:nil];
[vScrollView addSubview:view1];
vScrollView.contentOffset = CGPointMake(0, bounds.size.height);
// add view2 to the horizontal scroller
UIWebView *view2 = [[UIWebView alloc] initWithFrame:CGRectOffset(bounds, bounds.size.width, 0)];
[view2 loadHTMLString:@"<h1>2</h1>" baseURL:nil];
[hScrollView addSubview:view2];
// enable paging in both directions
hScrollView.pagingEnabled = TRUE;
vScrollView.pagingEnabled = TRUE;
Это позволит вам прокручивать в обоих направлениях, но также позволит вам прокрутить вправо от view3 к view2.Если вы хотите предотвратить это, вы должны отключить прокрутку на hScrollView
всякий раз, когда vScollView
показывает view3.Вы можете сделать это в scrollViewDidEndDecelerating:
в делегате vScrollView
.Что-то вроде:
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (scrollView == self.verticalScrollView) {
self.horizontalScrollView.scrollEnabled = (self.verticalScrollView.contentOffset.y > self.view.bounds.origin.y);
}
}