UICollectionView contentOffset изменения с настраиваемой компоновкой
У меня есть UICollectionView с пользовательским UICollectionViewLayout (на самом деле, я использую этот хороший макет).
Я устанавливаю contentOffset = CGPointZero
в viewDidLoad. Однако после viewDidLoad смещение равно -20, и содержимое выталкивается так:
![picture]()
(Это должно быть на одном уровне с линией). Я загружаю макет представления коллекции в конструкторе интерфейса. Кажется, что моя проблема очень похожа на эту, но решения там не работают для меня.
Я попытался изменить collectionViewContentSize
в моей реализации макета, чтобы убедиться, что он всегда больше, чем размер collectionView. Хотя это означает, что я могу прокручивать свой контент вниз (он короче, чем высота collectionView) и скрывать дополнительное пространство, я также могу прокручивать его вверх, чтобы увидеть его.
Ничто не похоже на работу!
Ответы
Ответ 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)
}
}