иос: представление ScrollView бесконечное разбиение на страницы - дубликаты заглушки


У меня есть вопрос о бесконечной подкачке в ScrollView. В моем приложении у меня есть только 3 подвида в ScrollView. Каждое подвидо загружается из файла xib. Обычно это выглядит как ABC в ScrollView. Я хотел сделать бесконечную подкачку, поэтому я добавил заглушки, и теперь это похоже на CABCA. Если пользователь находится на первом C, он переходит на обычный C, а если пользователь находится на последнем A, он переходит на обычный A. Вот код:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender {

  if (scrollView.contentOffset.x == 0)
  {
      [scrollView scrollRectToVisible:CGRectMake
      ((scrollView.frame.size.width * 3), 0,
      scrollView.frame.size.width,
      scrollView.frame.size.height) animated:NO];
  } 
  else if (scrollView.contentOffset.x == scrollView.frame.size.width * 4)
  {
     [scrollView scrollRectToVisible:CGRectMake
     (scrollView.frame.size.width, 0,
      scrollView.frame.size.width,
      scrollView.frame.size.height) animated:NO];
   }
}

Теперь это работает отлично. Но у меня есть ViewController для каждого подвида, и вот как Я добавляю их в ScrollView:

  subViewController1 = [[SubViewController1 alloc] initWithNibName:@"SubView" bundle:nil];
  subViewController1.view.frame =
    CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height);
  [scrollView addSubview:subViewController1.view];

Проблема в том, что существует один дубликат представления A и C, поэтому теперь у меня есть 5 контроллеров вместо 3. И если я хочу добавить что-то в представление, я должен добавить это также в дубликат представления.

Есть ли способ, как управлять представлением A и дубликатом A с помощью одного контроллера, чтобы мне не пришлось создавать два экземпляра одного контроллера? Спасибо.

1 5

1 ответ:

Еще лучше, вам не нужно иметь дубликат вида А и дубликат вида С, вы просто перемещаете их в - (void)scrollViewDidScroll:(UIScrollView *)scrollView, манипулируя contentOffset.

Настройка: вероятно, очень похоже на то, как вы уже это делаете.

Установите ваш UIScrollView, чтобы иметь contentSize 3 раза это ширина границ. Убедитесь, что подкачка включена и отскакивает.

Добавьте свои подвиды ABC в UIScrollView слева направо.

Также есть массив в вашем ViewController называется _contentViews что содержит ваш UIViews Азбука.

Затем выполните это, которое сбросит смещение содержимого и переместит ваши подвиды одновременно, когда scrollview достигнет краев:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if(scrollView.contentOffset.x == 0) {
        CGPoint newOffset = CGPointMake(scrollView.bounds.size.width+scrollView.contentOffset.x, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsRight];
    }
    else if(scrollView.contentOffset.x == scrollView.bounds.size.width*2) {
        CGPoint newOffset = CGPointMake(scrollView.contentOffset.x-scrollView.bounds.size.width, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsLeft];
    }
}

-(void)rotateViewsRight {
    UIView *endView = [_contentViews lastObject];
    [_contentViews removeLastObject];
    [_contentViews insertObject:endView atIndex:0];
    [self setContentViewFrames];

}

-(void)rotateViewsLeft {
    UIView *endView = _contentViews[0];
    [_contentViews removeObjectAtIndex:0];
    [_contentViews addObject:endView];
    [self setContentViewFrames];

}

-(void) setContentViewFrames {
    for(int i = 0; i < 3; i++) {
        UIView * view = _contentViews[i];
        [view setFrame:CGRectMake(self.view.bounds.size.width*i, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    }
}