带有collectionview的自定义菜单栏

Posted

技术标签:

【中文标题】带有collectionview的自定义菜单栏【英文标题】:Custom menu bar with collectionview 【发布时间】:2020-01-19 07:49:40 【问题描述】:

我想问。我从 collectionView 制作了一个自定义菜单栏,我想在滑动时链接和更改我的收藏视图菜单栏和来自另一个 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】:

您的 selectedMenu 属性不侦听具有 didSet property observer 的事件。所以当你在 scrollViewDidScroll 中设置 selectedMenu 时,什么也没有发生。

这可能是一个解决方案:

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

但是要小心 SegmentedView 的 collectionView(_:didSelectItemAt:) 方法,它会带来一些不想要的行为。您可以使用委托模式来触发另一个类中的方法。

【讨论】:

以上是关于带有collectionview的自定义菜单栏的主要内容,如果未能解决你的问题,请参考以下文章

Qt创建者,将指定位置的自定义菜单插入菜单栏

layoutAttributesForElements 上的自定大小左对齐 CollectionView 崩溃

csdn博客左侧栏定制化 (适配最新版csdn主题)

菜单栏应用程序的自定义视图上的 mouseDown 问题

顶部栏的自定义下拉菜单[关闭]

Android中的自定义选项菜单栏问题