Подтвердить что ты не робот

UICollectionView scrollToItemAtIndexPath

Я пытаюсь перейти к определенному элементу в виде коллекции, и, похоже, это происходит примерно в 90% случаев. У меня в основном есть просмотр коллекции, кадр которого я меняю с помощью автоматического макета, а затем я хочу, чтобы моя ячейка была размером с весь новый кадр, поэтому я установил новый размер. Когда я устанавливаю точку останова на scrollToItemAtIndexPath, кажется, что когда она работает, размер элемента вступил в силу, но раз, когда он не работает, ячейка по-прежнему имеет старый размер. Как я могу убедиться, что itemSize изменился перед прокруткой?

[weakSelf.view removeConstraints:@[weakSelf.verticalSpace, weakSelf.collectionViewBottomSpace, weakSelf.bottomLayoutTopCollectionView]];
[weakSelf.view addConstraints:@[weakSelf.collectionViewToTop, weakSelf.imageHeight, weakSelf.youLabelToTop]];
[UIView animateWithDuration:animated ? .5 : 0.0
                                      animations:^{
                                          [weakSelf.view layoutIfNeeded];
                                      }
                                      completion:^(BOOL finished) {
  UICollectionViewFlowLayout * layout = (UICollectionViewFlowLayout *)self.currentUserCollectionView.collectionViewLayout;

  layout.itemSize = weakSelf.currentUserCollectionView.frame.size;

  [weakSelf.currentUserCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:[self getSelectedIndex:selectItem] inSection:0]
                                         atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                                 animated:NO];
}];
4b9b3361

Ответ 1

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

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = // compute some index path

    [self.collectionView scrollToItemAtIndexPath:indexPath
                                atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                        animated:YES];
}

Ответ 2

Другой вариант - вызвать layoutIfNeeded на UICollectionView перед вызовом scrollToItemAtIndexPath. Таким образом, вы не будете выполнять операцию прокрутки каждый раз, когда выкладывается представление родительского представления.