2013-06-07 4 views
0

Я искал способ реализовать следующее:UIScrollView на дне UIScrollView

  • Есть один «мастер» Scrollview, который содержит как UIView полноэкранный на верхней и UIScrollView полноэкранное ниже это
  • Когда пользователь прокручивает мимо верхнюю UIView, нижняя Scrollview видна и становится ответчиком для прокрутки событий
  • Когда пользователь пытается прокрутить вверх от нижней UIScrollView, прикасается перенаправляется таким образом они контролируют «мастер 'scrollView и снова включить UIView.

Чтобы дать представление о том, как это изложено, вот моя текущая реализация:

// Initialise components: 

    mainScreen = [[UIScreen mainScreen] bounds]; 
    CGFloat screenHeight = mainScreen.size.height-20; 

    // Scroll View Controller 

    _scrollControl = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, screenHeight)]; 
    _scrollControl.contentSize = CGSizeMake(320, 2*screenHeight); // Twice as big as the screen size for both views to fit 
    _scrollControl.backgroundColor = [UIColor clearColor]; 
    _scrollControl.delegate = self; 

    // Top View 

    _topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, screenHeight)]; 
    _topView.backgroundColor = [UIColor redColor]; 

    [_scrollControl addSubview:_topView]; 

    // Bottom View 
    _bottomView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, screenHeight, 320, screenHeight)]; 
    _bottomView.backgroundColor = [UIColor yellowColor]; 
    _bottomView.contentSize = CGSizeMake(320, 2*screenHeight); 

    _bottomView.delegate = self; 

    UILabel *imageLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 700)]; 
    imageLabel.backgroundColor = [UIColor greenColor]; 

    [_bottomView addSubview:imageLabel]; 

    [_scrollControl addSubview:_bottomView]; 

    // Add to main view 
    [self.view addSubview:_scrollControl]; 

Я пытался достичь желаемого эффекта, используя методы делегата, однако я не могу остановиться «master» scrollView от прокрутки до того, как он переключится на нижний scrollView.

ответ

0

Apple предоставляет эту функциональность бесплатно, поэтому хорошая новость заключается в том, что вам не нужно на самом деле ничего прямо что-то писать (если вы не хотите что-то немного фанки). Эффект достигается за счет пейджинга

scrollView.pagingEnabled = YES; 

До этого будет принимать какие-либо реальный эффект, вы должны встраивать подвидов (как UIView и UIScrollView) в окне мастер прокрутки. Каждый из них должен быть одного размера или размера одной страницы. Так скажем, вид мастер прокрутки 100, 100 очков, мы могли бы установить его так:

CGRect pageRect = CGRectMake(0, 0, 100, 100); 
NSInteger pageCount = 2; 
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:pageRect]; 
scrollView.pagingEnabled = YES; 

UIView *page1View = [[UIView alloc] initWithFrame:pageRect]; 
page1View.backgroundColor = [UIColor redColor]; 
[scrollView addSubview:page1View]; 
pageRect.origin.x += pageRect.size.width; 

UIView *page2View = [[UIView alloc] initWithFrame:pageRect]; 
page2View.backgroundColor = [UIColor blueColor]; 
[scrollView addSubview:page2View]; 

scrollView.contentSize = CGSizeMake(pageRect.size.width * pageCount, 
            pageRect.size.height); 

Это должно дать вам основы. Как вы видите, в этом примере мы позиционируем subviews один за другим горизонтально. Мы установили размер содержимого для охвата обоих подзонов и включения пейджинга. UIScrollView должен заботиться обо всем остальном.

Хорошее место для просмотра на сессиях сессии WWDC, в частности, с WWDC 2010 at: Session 104 - Проектирование приложений со списком прокрутки. У этого есть много информации о том, как настроить списки прокрутки и действительно получить максимальную отдачу от них.

Надеюсь, это поможет!

+0

Спасибо за предложение - пейджинг может помочь уменьшить «переход» Я пытаюсь добиться, но то, что вы предложили это немного отличается от того, что я получаю. - У меня в основном есть просмотр прокрутки, встроенный в scrollview, и оба они прокручиваются по вертикали, и проблема обрабатывается, когда происходит переход между ними, так что нижний scrollView будет управлять и включаться, когда «master» scrollView имеет прокручивается на дно. – Sarreph

+0

UIScrollView автоматически достигает этого. Когда вы дойдете до нижней части детского прокрутки, оно автоматически затем позволяет событиям касания просачиваться в родительский вид прокрутки. То же самое при прокрутке в противоположном направлении. –

0

так что если вы хотите, чтобы обнаружить его с помощью быстр, используйте это:

override func scrollViewDidScroll(scrollView: UIScrollView) { 

    if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) { 
     //reach bottom 
    } 

    if (scrollView.contentOffset.y < 0){ 
     //reach top 
    } 

    if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){ 
     //not top and not bottom 
    } 
} 
Смежные вопросы