UIScrollView, эффект Pull down, похожий на CalcBot - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь сделать интерфейс, похожий на CalcBot, где вы можете опустить контроллер вида пальцем, и он показывает скрытый фоновый вид.

Я думаю, что это делается с помощью UIScrollView, но я не могу определить точный метод, например, для 2х горизонтальных видов, при этом один из них имеет вертикальный вид.

Example of what I am trying to achieve

У меня горизонтальная прокрутка работает нормально, я просто застрял в том, как я могу сделать экран 1 с вертикальной прокруткой.

Любые советы или указатели будут оценены.

Спасибо, Аарон

1 Ответ

4 голосов
/ 16 июня 2011

Вы можете иметь вложенные виды прокрутки, чтобы прокрутка работала в обоих направлениях.Давайте иметь вертикальный скроллер внутри горизонтального скроллера (хотя вы можете сделать это и в обратном направлении), поэтому представления 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...