Добавление CollectionViewController в качестве subView - PullRequest
0 голосов
/ 18 января 2020

Используя Swift 5.1.3, iOS13.3, XCode11.3,

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

Проблема теперь заключается в следующем: как только я нажимаю на перетаскивание, содержимое collectionView «исчезает» (т.е. становится прозрачным). Если вы внимательно посмотрите, то увидите, что полоса прокрутки все еще там.

Почему контент collectionView становится прозрачным, как только я нажимаю на него?

Вот видео, иллюстрирующее ошибку поведение:

Ниже вы найдете соответствующий код:

enter image description here

Вот код:

Внутри моего Main-ViewController Я добавляю collectionView:

override func viewDidLoad() {
    super.viewDidLoad()
    let cardsHorizontalController = CardsHorizontalController() 

    self.view.addSubview(cardsHorizontalController.view)

    cardsHorizontalController.view.translatesAutoresizingMaskIntoConstraints = false
    cardsHorizontalController.view.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100.0).isActive = true
    cardsHorizontalController.view.heightAnchor.constraint(equalToConstant: 279).isActive = true
    cardsHorizontalController.view.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true
}

Вот класс контроллера collectionView:

class CardsHorizontalController: BaseListController, UICollectionViewDelegateFlowLayout {

    let cellId = "cellId"

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.backgroundColor = .clear

        collectionView.register(CardHeaderCell.self, forCellWithReuseIdentifier: cellId)

        if let layout = collectionViewLayout as? UICollectionViewFlowLayout {
            layout.scrollDirection = .horizontal
        }

        collectionView.contentInset = UIEdgeInsets(top: 100, left: 0, bottom: 0, right: 0)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return .init(width: view.frame.width - 48, height: view.frame.height)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return .init(top: 0, left: 16, bottom: 0, right: 0)
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 3
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
        return cell
    }

}

И соответствующий ему родительский класс:

class BaseListController: UICollectionViewController {

    init() {
        super.init(collectionViewLayout: UICollectionViewFlowLayout())
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

И здесь ячейка collectionView в игре:

class CardHeaderCell: UICollectionViewCell {

    let imageView = UIImageView(cornerRadius: 8)

    override init(frame: CGRect) {
        super.init(frame: frame)

        imageView.backgroundColor = .red

        let stackView = VerticalStackView(arrangedSubviews: [
            // companyLabel,
            // titleLabel,
            imageView
            ], spacing: 12)
        addSubview(stackView)
        stackView.fillSuperview(padding: .init(top: 16, left: 0, bottom: 0, right: 0))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

}

Ответы [ 2 ]

1 голос
/ 19 января 2020

Я наконец нашел решение:

Необходимо добавить collectionView-Controller (то есть CardsHorizontalController()) как ChildController !

Внутри Main-ViewController's viewDidLoad() (в первом абзаце кода выше), пожалуйста, замените следующую строку ...

self.view.addSubview(cardsHorizontalController.view)

следующим:

self.addChild(cardsHorizontalController)
self.view.addSubview(cardsHorizontalController.view)
self.didMove(toParent: cardsHorizontalController)

После этого все работает как положено!

В этом репозитории GitHub вы найдете рабочий проект (урезанный только с CollectionView): https://github.com/iKK001/HorizontalCollectionViewExample

И так как я так счастлив - вот видео рабочей горизонтальной CollectionView:

enter image description here

0 голосов
/ 18 января 2020

Вы пытались изменить return .init(width: view.frame.width - 48, height: view.frame.height) внутри sizeForItemAt на return .init(width: collectionView.frame.width - 48, height: collectionView.frame.height)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...