it-roy-ru.com

UICollectionView с ContentInset не прокручивает весь путь вниз

Я устанавливаю содержимое вставки UICollectionView:

[_collectionView setContentInset:UIEdgeInsetsMake(0.f, 0.f, 100.f, 0.f)];

Затем я прокручиваю программно до самого конца UICollectionView с помощью этого метода:

- (void)scrollToLastMessageAnimated:(BOOL)animated;
{
    if (_messages.count == 0) { return; }

    NSUInteger indexOfLastSection = _messagesBySections.count - 1;
    NSInteger indexOfMessageInLastSection = [_messagesBySections[indexOfLastSection] count] - 1;
    NSIndexPath *path = [NSIndexPath indexPathForItem:indexOfMessageInLastSection
                                            inSection:indexOfLastSection];

    [_collectionView scrollToItemAtIndexPath:path
                           atScrollPosition:UICollectionViewScrollPositionCenteredVertically
                                   animated:animated];
}

Он прокручивается вниз, но игнорирует contentInset, что означает, что последние ячейки находятся ниже указанной вставки содержимого:

enter image description here Левое изображение показывает, как оно выглядит сейчас после того, как вид появился. На правом изображении я прокрутил вручную вниз до последнего сообщения.

Я использую AutoLayout, есть идеи, почему это происходит?

Правка:

Вот скриншот настройки IB: enter image description here

12
Ben Marten

Сегодня случайно нашел решение!

Выберите контроллер вида и снимите флажок «Настроить вставки вида прокрутки».

enter image description here

Если этот параметр не установлен, iOS не будет автоматически корректировать ваши вставки вида (и, вероятно, его подпредставления), что вызвало у меня проблемы ... Снимите этот флажок и настройте вставки прокрутки следующим образом:

- (void)configureInsetsOfCollectionView
{
    [_collectionView setContentInset: UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + [UIApplication sharedApplication].statusBarFrame.size.height + DEFAULT_SPACING, 0.f, _keyboardHeight + _toolbar.bounds.size.height + DEFAULT_SPACING, 0.f)];
    [_collectionView setScrollIndicatorInsets:UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + [UIApplication sharedApplication].statusBarFrame.size.height, 0.f, _keyboardHeight + _toolbar.bounds.size.height, 0.f)];
}
29
Ben Marten

Если вы используете макет потока, попробуйте установить _collectionView.collectionViewLayout.sectionInset.

8
Arjuna

Возможная проблема

Вы установили collectionView под панелью инструментов и добавили ограничения внизу суперпредставления для обоих представлений.

Решение

Установите ограничения панели инструментов снизу, впереди и установите ширину и высоту фиксированного размера. Для вашего collectionView установите ограничения сверху, снизу с помощью панели инструментов, ведущей к суперпредставлению и (альтернативно) с фиксированным размером ширины.

Обновление

CollectionView

Выполните следующие шаги, чтобы заставить это работать:

Проверьте представление коллекции, и не помещайте его под панель инструментов, и добавьте эти ограничения, выбрав свой collectionView в Outline документа, нажмите Ctrl и перетащите его в представление, появится всплывающее окно, удерживайте Shift и выберите эти ограничения.

CollectionView Constraints

Панель инструментов

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

Toolbar Constraints

Работа с прокруткой перед viewAppears

-(void)viewWillAppear:(BOOL)animated
{
    [collectionView reloadData];
    [self scrollToLastMessageAnimated:YES];
}
2
EridB

Swift версия

collectionview.contentInset = UIEdgeInsetsMake(44,0,0,0)
collectionview.scrollIndicatorInsets = UIEdgeInsetsMake(44,0,0,0)
2
Yoni Katz

Вы можете установить функцию referenceSizeForFooterInSection в своем классе viewController:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
    return CGSize(width: view.frame.width, height: 50)
}

Просто установите высоту на нужное вам значение.

1
T. Christiansen