Автоматическая прокрутка UICollectionView при прокрутке UITableview - PullRequest
3 голосов
/ 10 мая 2019

У меня горизонтальная CollectionView сверху и TableView под ней Я хочу, чтобы при прокрутке TableView мой CollectionView должен был прокручиваться и анимироваться вместе с некоторым уровнем, которого я достиг с помощью scrollItemTo, но CollectionView прокрутка медленная, но я хочу, чтобы он работал, как он работает в uberEats приложение для iOS в списке элементов ресторана и то же самое работает в urbanClap app

Это похоже на перемещение ячейки представления за ячейкой, когда заголовок раздела табличного представления достигает вершины

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Функциональность приложения uber, на которую вы ссылаетесь, работает следующим образом: всякий раз, когда определенный раздел tableView достигает вершины, выбирается конкретный collectionViewCell.

Как видно из приведенного выше утверждения,

количество элементов в collectionView = количество разделов в tableView

Вы можете решить эту конкретную проблему, отследив верхний видимый индекс секции tableView, а затем выбрав collectionViewCell по этому конкретному индексу, т.е.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView === self.tableView {
        if
            let topSectionIndex = self.tableView.indexPathsForVisibleRows?.map({ $0.section }).sorted().first,
            let selectedCollectionIndex = self.collectionView.indexPathsForSelectedItems?.first?.row,
            selectedCollectionIndex != topSectionIndex {
            let indexPath = IndexPath(item: topSectionIndex, section: 0)
            self.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally)
        }
    }
}

enter image description here

Изменение collectionViewCell цвета на выбор:

Создайте пользовательское свойство UICollectionViewCell и переопределите **isSelected** для обработки выбранного и невыбранного состояния, т.е.

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!

    override var isSelected: Bool {
        didSet {
            if self.isSelected {
                self.contentView.backgroundColor = #colorLiteral(red: 0.2588235438, green: 0.7568627596, blue: 0.9686274529, alpha: 1)
            } else {
                self.contentView.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
            }
        }
    }
}

После этого вам не нужно будет вручную обновлять backgroundColor ячейки в другом месте.

1 голос
/ 10 мая 2019

Вы можете реализовать scrollViewDidScroll из UIScrollViewDelegate для вашего tableView, а затем вручную прокрутить ваш UICollectionView оттуда

class XYZ: UIViewController, UIScrollViewDelegate{

     func viewDidLoad(){
         super.viewDidLoad()
         tableView.delegate = self
     }


    func scrollViewDidScroll(_ scrollView: UIScrollView){
         let tableView = scrollView //assuming the only scrollView.delegate you conform to is the tableVeiw

         collectionView.contentOffset = someMappingFrom(tableView.contentOffset) //or some other scrolling mechanism (scrollToItem)
    }


}

...