иос: представление 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 ответ:
Еще лучше, вам не нужно иметь дубликат вида А и дубликат вида С, вы просто перемещаете их в
- (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)]; } }