2013-02-14 3 views
6

Я пытаюсь использовать UICollectionView для отображения вида слева и справа от текущего представления, расположенного по центру экрана.ios - UICollectionView изменить смещение по умолчанию при горизонтальном поисковом вызове

У меня это отображается правильно, но горизонтальный пейджинг не сосредоточен на последующих представлениях, поскольку по умолчанию он равен ширине фрейма, который равен 320,0.

Где UICollectionView вычисляет значение смещения по умолчанию, которое оно использует при отсечении на следующие страницы?

Я хотел бы изменить это значение. Есть лучший способ сделать это? По сути, я пытаюсь воссоздать опыт, используемый в результатах поиска для магазина приложений на iphone.

+0

Thankyou для аллюзии к результатам поиска AppStore (пост IOS 6), которые действительно помогли ... Я хотел бы знать, что вы имеете в виду, когда вы говорите это рамка scrollView, вы имеете в виду, что это ширина вашего ScrollView? –

+0

Независимо от этого (я упомянул в комментарии выше), решение, которое вы ищете, находится здесь: http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html –

ответ

11

Оказалось, что я должен был установить pagingEnabled = NO и отменяют (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView следующим:

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
    if (self.lastQuestionOffset > scrollView.contentOffset.x) 
    self.currentPage = MAX(self.currentPage - 1, 0); 
    else if (self.lastQuestionOffset < scrollView.contentOffset.x) 
    self.currentPage = MIN(self.currentPage + 1, 2); 

    float questionOffset = 290.0 * self.currentPage; 
    self.lastQuestionOffset = questionOffset; 
    [self.collectionView setContentOffset:CGPointMake(questionOffset, 0) animated:YES]; 
} 

Этот ответ помог: Paging UIScrollView with different page widths

+2

Еще одна вещь, которую я нашел, это использовать ее при прокрутке: '[self.collectionView scrollRectToVisible: CGRectMake (questionOffset, 0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height) анимированный: ДА] ; 'Он работает намного более плавным, чем анимированный метод setContentOffset, используемый выше. – whittwuli

+0

Я просто обрушился на это, пытаясь сделать представление UICollection таким же, как большие прямоугольники в верхней части страницы, если iPhone iOS AppStore. В настоящее время я работаю в (CGPoint) targetContentOffsetForProposedContentOffset: withScrollingVelocity. Но я думаю о том, чтобы реализовать такое решение, как ваше. У меня есть вопрос, однако, является ли ваше свойство self.lastQuestionOffset чем-то вроде (размер ячейки + вставка) * (количество ячеек)? – vichudson1

+0

Еще лучшим решением было бы использовать - '(void) scrollViewWillEndDragging: (UIScrollView *) scrollView withVelocity: (CGPoint) speed targetContentOffset: (inout CGPoint *) targetContentOffset' затем рассчитать и установить целевой контент в соответствии с вашими поисковыми запросами (это параметр * inout *) – GreatWiz

6

Я думаю, что лучшим решением является добавление пользовательского UICollectionViewFlowLayout подкласс и переопределить

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)contentOffset 
           withScrollingVelocity:(CGPoint)velocity 

Я написал пример здесь: https://gist.github.com/mmick66/9812223

0

попытка установить contentOffset в viewDidLayoutSubviews

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    if (viewDidLayoutSubviewsForTheFirstTime) { 
     _collectionView.contentOffset = CGPointMake(...); 
    } 
} 
+0

Это практически идентично принятому ответу ... – JAL

Смежные вопросы