2013-03-20 5 views
38

У меня есть горизонтальный UICollectionView, который отлично работает и свитки. Когда я нажимаю элемент, я обновляю свои данные и звоню reloadData. Это работает, и новые данные отображаются в UICollectionView. Проблема в том, что положение прокрутки не изменяется, и оно все еще просматривает последнее место. Я хочу сбросить прокрутку вверх (или оставить в моем случае). Как я могу это сделать?Сброс прокрутки по UICollectionView

+0

Можете ли вы показать свой код при возникновении этой проблемы? Я пытаюсь заставить свой scrollview не прокручиваться, когда я перезагружаю данные lol, у меня есть противоположность вашей проблемы! –

ответ

27

Вы можете использовать этот метод для перехода к любому пункту вы хотите:

- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath 
       atScrollPosition:(UICollectionViewScrollPosition)scrollPosition 
         animated:(BOOL)animated 
+16

Это не будет работать, если нет элементов – CyberMew

+1

Также не допускается смещение – Dermot

+0

@ Dermot, вам удалось заставить его работать со смещением? – inigo333

141

Вы хотите setContentOffset:. Для CGPoint и аргумента требуется, чтобы вы могли установить, что хотите, используя CGPointMake, но если вы хотите вернуться к самому началу коллекции, вы можете просто использовать CGPointZero.

[collectionView setContentOffset:CGPointZero animated:YES]; 
+0

, если функция просмотра коллекции разрешает обновление, будет отображаться обновленный вид – jasonhao

+1

+1 'setContentOffset' помог мне работать для UIScrollView. – NeverHopeless

+26

В случае, если вы используете 'contentInsets', вы можете использовать следующую точку для смещения содержимого' CGPointMake (-collectionView.contentInset.left, -collectionView.contentInset.top) ' – TPoschel

4

К сожалению, я не мог комментировать в момент написания этой статьи, но я с помощью UINavigationController и CGPointZero сам Бесполезный «Поднимите меня на самый верх, поэтому мне пришлось использовать следующее.

CGFloat compensateHeight = -(self.navigationController.navigationBar.bounds.size.height+[UIApplication sharedApplication].statusBarFrame.size.height); 
[self.collectionView setContentOffset:CGPointMake(0, compensateHeight) animated:YES]; 

Надеюсь, это поможет кому-то в будущем. Ура!

2

Чтобы справиться с UINavigationController и прозрачной навигационной панелью, мне пришлось вычислять дополнительное верхнее смещение, чтобы идеально соответствовать положению первого элемента.

Swift 1.1 Код:

 let topOffest = CGPointMake(0, -(self.collectionView?.contentInset.top ?? O)) 
    self.collectionView?.setContentOffset(topOffest, animated: true) 

Ура!

10

В Swift:

collectionView.setContentOffset(CGPointZero, animated: true) 

Если оставить мнение, что дома вид сбора, внести изменения во 2-м контроллере представления, и потребуется представление коллекции для обновления по возвращении:

@IBAction func unwindTo_CollectionViewVC(segue: UIStoryboardSegue) { 
    //Automatic table reload upon unwind 
    viewDidLoad() 
    collectionView.reloadData() 
    collectionView.setContentOffset(CGPointZero, animated: true) 
} 

В моей ситуации разматывание отлично, потому что вызов viewDidLoad обновит контекст CoreData, вызов reloadData будет проверять, что обновления коллекцииView отражают новый контекст CoreData, а затем contentOffset убедится, что таблица вернется в начало.

14

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

extension UIScrollView {   
    /// Sets content offset to the top. 
    func resetScrollPositionToTop() { 
     self.contentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top) 
    } 
} 

Поэтому, когда мне нужно сбросить положение:

self.collectionView.resetScrollPositionToTop() 
4

CGPointZero в моем случае сдвинул содержимое представления коллекции, потому что вы не учитываете содержимое вставки. Это то, для чего это сработало для меня:

CGPoint topOffest = CGPointMake(0,-self.collectionView.contentInset.top); 
    [self.collectionView setContentOffset:topOffest animated:YES]; 
+0

Простой и чистый! –

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