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

UICollectionView contentOffset изменения с настраиваемой компоновкой

У меня есть UICollectionView с пользовательским UICollectionViewLayout (на самом деле, я использую этот хороший макет).

Я устанавливаю contentOffset = CGPointZero в viewDidLoad. Однако после viewDidLoad смещение равно -20, и содержимое выталкивается так:


picture

(Это должно быть на одном уровне с линией). Я загружаю макет представления коллекции в конструкторе интерфейса. Кажется, что моя проблема очень похожа на эту, но решения там не работают для меня.

Я попытался изменить collectionViewContentSize в моей реализации макета, чтобы убедиться, что он всегда больше, чем размер collectionView. Хотя это означает, что я могу прокручивать свой контент вниз (он короче, чем высота collectionView) и скрывать дополнительное пространство, я также могу прокручивать его вверх, чтобы увидеть его.

Ничто не похоже на работу!

4b9b3361

Ответ 1

Единственное решение, которое я мог придумать, имело едва приемлемое поведение:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (self.collectionView.contentOffset.y < 0) {
        self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
    }
}

Как и установка высоты содержимого на fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight]) в collectionViewContentSize

Это удаляет пространство над заголовком раздела, но оно удаляет "отскок" сверху. Довольно субоптимальное решение, но довольно приемлемое.

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

Ответ 2

Я нашел причину, почему это происходит. Проверьте принятый ответ на этот вопрос: Строка состояния и панель навигации отображаются на границах моего представления в iOS 7

В самом деле, мы могли бы просто установить свойства edgesForExtendedLayout или automaticallyAdjustsScrollViewInsets UIViewController в IB (если вы используете Storyboard) в viewDidLoad, и это исправит нашу проблему.

Просто не забудьте проверить, что это свойство доступно, потому что в iOS6 или ранее это вызовет сбой:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

Привет!

Ответ 3

Я начал обнаруживать, что эта проблема появляется на iOS 11, где у меня было представление прокрутки в представлении прокрутки. Мне понадобился почти день, чтобы понять это.

Попробуйте установить поведение настройки вставки содержимого:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
}

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

Ответ 4

let oldContentSizeHeight: CGFloat = self.colName.contentSize.height
        self.colName.reloadData()
        self.colName.layoutIfNeeded()
        self.view.layoutIfNeeded()
        self.colName.contentOffset.y = self.colName.contentOffset.y + (self.colName.contentSize.height - oldContentSizeHeight)

Ответ 5

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

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if self.collectionView.contentOffset.y < 0 {
        self.collectionView.contentOffset = CGPoint(x: self.collectionView.contentOffset.x, y: 0.0)
    }
}