UICollectionView показывает индикатор прокрутки для каждого раздела (заголовок zIndex не работает)

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

введите описание изображения здесь

Кто-нибудь сталкивался с такой же проблемой? Я использую Xcode 9 beta 3. Моя настройка просмотра коллекции довольно распространена:

private let formCollectionView: UICollectionView = {
        let collectionViewLayout = UICollectionViewFlowLayout()
        collectionViewLayout.minimumLineSpacing = 0
        collectionViewLayout.minimumInteritemSpacing = 0
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = UIColor.clear
        return collectionView
}()

Изменить 16.10.2017

Даже у Твиттера, кажется, есть эта проблема:

введите описание изображения здесь


person Viktor Kucera    schedule 20.07.2017    source источник
comment
странный. По скриншоту сложно сказать, но действительно ли это индикаторы прокрутки, а не какой-то другой вид, который обрезается?   -  person NRitH    schedule 20.07.2017
comment
Это определенно индикаторы прокрутки, так как я могу избавиться от них, установив для showsVerticalScrollIndicator значение false. Пока я прокручиваю, они появляются и уменьшают свою высоту, пока не исчезнут. И нет, я не курю гашиш.   -  person Viktor Kucera    schedule 20.07.2017
comment
нет обновлений по этому поводу? Это происходит для всех iOS-версий?   -  person swalkner    schedule 12.10.2017
comment
Насколько я знаю, это просто последняя проблема iOS 11.   -  person Viktor Kucera    schedule 12.10.2017
comment
Представление нижнего колонтитула/заголовка, кажется, перекрывает полосу прокрутки, которая, по-видимому, имеет более низкое zPosition, чем верхние/нижние колонтитулы раздела.   -  person strangetimes    schedule 05.08.2018


Ответы (4)


вы можете исправить эту проблему в делегате method.as в следующем примере

Цель-C

- (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
    {
        if (@available(iOS 11.0, *)) {
            if ([elementKind isEqualToString:UICollectionElementKindSectionHeader]) {
                view.layer.zPosition = 0;
            }
        }
    }

Свифт

func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {
    if elementKind == UICollectionView.elementKindSectionHeader {
        view.layer.zPosition = 0
    }
}
person zhiyong.Zou    schedule 04.01.2018
comment
Это решение работает более последовательно, чем другие. - person Jerry; 27.01.2018
comment
Дело не в последовательности, это на самом деле правильная коллекция. Это не несколько полос прокрутки, это одна и та же полоса прокрутки, перекрываемая представлением заголовка раздела, которое, по-видимому, имеет более высокое zPosition, чем остальные дочерние представления, но ниже, чем индикатор полосы прокрутки. Полоса прокрутки перекрывается непрозрачным видом заголовка на снимке экрана выше, что создает впечатление наличия нескольких индикаторов полосы прокрутки. - person strangetimes; 05.08.2018

Итак, прежде всего уже есть радар.

Существует предлагаемый обходной путь. Мне частично удалось сделать это дерьмо внутри моего подкласса UICollectionReusableView.

override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
    super.apply(layoutAttributes)
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
        self.layer.zPosition = 0
    }
}

Я говорю частично, потому что, если у вас есть немного более длинный UICollectionView, он все еще поврежден для некоторых заголовков. Хотя большинство из них в порядке. Так что это зависит от вашей ситуации. Надеюсь, этот радар скоро будет рассмотрен.

person Viktor Kucera    schedule 23.08.2017
comment
Существует надежный обходной путь. - person Viktor Kucera; 28.11.2017

Это не несколько индикаторов прокрутки. Z-индекс представлений заголовка выше, чем у представления индикатора прокрутки.

Редактировать: нашел кое-что более интересное, если вы запустите отладчик представления, индикатор прокрутки будет расположен над заголовками... происходит что-то странное.

person Saren Inden    schedule 22.09.2017
comment
Интересно. Потому что у меня также есть ошибка в моем представлении коллекции, которая при редактировании (переупорядочивании/перетаскивании) представления заголовка ячеек закрывает перетаскиваемую ячейку. Однако я нигде не устанавливаю zIndex. Я не использую пользовательский макет, только referenceSizeForHeaderInSection и sizeForItemAt для адаптации ориентации устройства. В iOS 10 все работает отлично. Вы тоже сталкивались с этой ошибкой? У вас нет подсказки, как исправить? - person Viktor Kucera; 22.09.2017
comment
Только что нашел соответствующий радар. Однако не повезло с предложенным обходным путем. - person Viktor Kucera; 11.10.2017

Есть простой способ решить эту проблему. В классе представления заголовка раздела вы можете переопределить метод layoutSubviews и написать:

- (void)layoutSubviews {
    [super layoutSubviews];
    self.layer.zPosition = 0;
}

Потому что до iOS11 значение zPosition слоя вида сечения по умолчанию равно 0, но в iOS11 это значение по умолчанию равно 1.

person Jack Ma    schedule 19.10.2017
comment
Он до сих пор остается сломанным для меня. Не все заголовки, но есть. Скорость исправления кажется очень похожей на уже предложенное переопределение apply(_:) :( - person Viktor Kucera; 19.10.2017
comment
эээ ... может быть, вам следует использовать «Иерархия представления отладки» или «Показать», чтобы проверить, действительно ли zPosition уровня представления заголовка раздела установлен на 0. - person Jack Ma; 19.10.2017