Пользовательская строка меню с коллекцией - PullRequest
0 голосов
/ 19 января 2020

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

swipe collectionView

, но при попытке провести влево и вправо моя строка меню не отображается, я уже делаю ссылка для захвата значения. но это все еще не работа. вот мой код

class SegmentedView: UIView {

    let collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        return cv
    }()

    let knowledge = ["Pengetahuan", "Keterampilan", "Sikap"]
    var selectedMenu: CGFloat?

    }

extension SegmentedView: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return knowledge.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! SegmentedCell
        let item = knowledge[indexPath.item]
        cell.nameLabel.text = item

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        selectedMenu = CGFloat(indexPath.item) * frame.width
    }
}

// This from my SegmentedViewController
class SegmentedViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var segmentedViews: SegmentedView!

    let cellId = "assesmentCell"
    let colors: [UIColor] = [UIColor.blue, UIColor.yellow, UIColor.green]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        setupCollection()
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print(scrollView.contentOffset.x / 3)
        segmentedViews.selectedMenu = scrollView.contentOffset.x / 3
    }

    func setupCollection() {
        if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            flowLayout.scrollDirection = .horizontal
            flowLayout.minimumLineSpacing = 0
        }
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.isPagingEnabled = true
    }
}

спасибо.

1 Ответ

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

Ваше свойство selectedMenu не прослушивает событие с наблюдателем свойства didSet . Поэтому, когда вы устанавливаете selectedMenu в scrollViewDidScroll, ничего не происходит.

Это может быть решением:

var selectedMenu: CGFloat? {
    didSet {
        collectionView.selectItem(at: <#T##IndexPath?#>, animated: <#T##Bool#>, scrollPosition: <#T##UICollectionView.ScrollPosition#>)
    }
}

Но будьте осторожны с методом collectionView (_: didSelectItemAt :) метода SegmentedView, он может принести некоторые нежелательные поведения. Вы можете использовать шаблон делегата для запуска метода в другом классе.

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