Настройка collectionView.scrollToItem рассмотреть вставку?

Я иногда прокручиваю влево от такой ячейки:

collectionView.scrollToItem(
    at: IndexPath(row: 5, section: 0),
    at: .left, // TODO: Left ignores inset
    animated: true
)

вот как это начинается до scrollToItem реализовано:

enter image description here

однако, когда я пытаюсь использовать scroll to item, он прикрепляет ячейку к краю, а не рассматривает вставку:

enter image description here

есть ли простой способ исправить collectionView.scrollToItem приспособить вставки?

3 ответов


С

   /**
     Assumptions:
     1. Your collection view scrolls horizontally
     2. You are using UICollectionViewFlowLayout to layout you collection view

     @param indexPath IndexPath to scroll to
     @param animated Toggle animations
     */
    - (void)scrollToIndexPathPreservingLeftInset:(NSIndexPath *)indexPath animated:(BOOL)animated {
        UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)collectionView.collectionViewLayout;
        CGFloat sectionLeftInset = layout.sectionInset.left;
        UICollectionViewLayoutAttributes *attri = [layout layoutAttributesForItemAtIndexPath:indexPath];
        [collectionView setContentOffset:CGPointMake(attri.frame.origin.x - sectionLeftInset, 0) animated:animated];
    }

Swift (не проверено синтаксически)

func scroll(toIndexPathPreservingLeftInset indexPath: IndexPath, animated: Bool) {
    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    let sectionLeftInset = layout.sectionInset.left
    var attri = layout.layoutAttributesForItem(at: aPath)
    collectionView.setContentOffset(CGPoint(x: (attri?.frame.origin.x - sectionLeftInset), y: 0), animated: animated)
}

пример gif


поскольку каждый кадр ячейки учитывает его вставку раздела, вы также можете использовать scrollRectToVisible(_:animated:).

let cell = collectionView.cellForItem(at: indexPath)!
collectionView.scrollRectToVisible(cell.frame, animated: true)

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


вы можете использовать обычный метод collectionView.scrollToItem Если вы установите отступ в collectionView.contentInset вместо layout.sectionInset.