加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

uicollectionview – 嵌入在Navigation Controller中时,Collecti

发布时间:2020-12-14 04:27:48 所属栏目:百科 来源:网络整理
导读:我有一个简单的集合视图测试(基于在线教程),它独立工作.但是当我将它嵌入导航控制器时,它就会停止工作.我在代码中构建了屏幕:(1)创建一个headerView(64像素高)并将其添加到顶部的视图中. (2)我构建了一个集合视图并将其添加到headerView中. 这是代码: impo
我有一个简单的集合视图测试(基于在线教程),它独立工作.但是当我将它嵌入导航控制器时,它就会停止工作.我在代码中构建了屏幕:(1)创建一个headerView(64像素高)并将其添加到顶部的视图中. (2)我构建了一个集合视图并将其添加到headerView中.

这是代码:

import UIKit

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UINavigationControllerDelegate
{
var collectionView : UICollectionView!
var topView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()
    var frame = CGRect(x:0,y:128,width:view.frame.width,height:64)
    topView = UIView(frame:frame)
    self.view.addSubview(topView)

    // CollectionView
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    layout.sectionInset = UIEdgeInsets(top: 0,left: 10,bottom: 0,right: 10)
    layout.itemSize = CGSize(width: 50,height: 50)

    frame = CGRect(x: 0,y: 0,width: Int(self.topView.frame.width),height: Int(self.topView.frame.height))
    collectionView = UICollectionView (frame: frame,collectionViewLayout: layout)
    collectionView.dataSource = self
    collectionView.delegate = self
    collectionView.register(UICollectionViewCell.self,forCellWithReuseIdentifier: "collectionCell")
    collectionView.backgroundColor = UIColor.green
    self.topView.addSubview(collectionView)

}

//MARK: - CollectionView

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



func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell",for: indexPath as IndexPath)
    for v in cell.subviews {
        v.removeFromSuperview()
    }
    cell.backgroundColor = UIColor.orange

    let label = UILabel(frame: CGRect(x:0,y:0,width:50,height:50))
    label.text = "(indexPath.item)"
    label.textAlignment = .center
    label.textColor = UIColor.white
    cell.addSubview(label)

    return cell
}

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

解决方法

如上所述,我无法使考查尔的建议工作.它确实给了我一个线索,我对嵌入集合视图的视图的定位在viewDidLoad中被错放了,原因我还没理解.但是,通过将集合视图配置放在viewDidAppear(而不是viewDidLoad)中,它运行良好.我将y位置偏移64以清除导航栏,并将行高减少到64.我还将代码只执行一次,以便从页面导航不会添加多个彼此顶部的视图.顺便说一句,我最初的目标是水平滚动细胞.在我的程序中,我有相应部分的tableview,并且想法是使用具有水平滚动单元格的行移动到相应的部分.

代码如下所示:

//
//  CustomViewController.swift
//  DSM Tracker
//
//  Created by Syed Tariq on 1/7/17.
//  Copyright ? 2017 com.syedtariq. All rights reserved.
//

import UIKit


class ViewController: UIViewController,UINavigationControllerDelegate

{

    var executeOnce = true
    var cellDimensions = [String:Int]()
    var cellHeight = 50
    var cellWidth = 120

    var collectionContainerView: UICollectionView!
    var navBar: UINavigationBar = UINavigationBar()


    // view constants
    var viewY = CGFloat()
    var viewX = CGFloat()
    var viewWidth = CGFloat()
    var viewHeight = CGFloat()


    // gaps from view edge
    let leftGap = CGFloat(20)
    let rightGap = CGFloat(20)


    // navbar constants
    let navBarHeight = CGFloat(64)

    var headerLabels = ["Cell 01","Cell 02","Cell 03","Cell 04","Cell 05","Cell 06","Cell 07","Cell 08","Cell 09","Cell 10","Cell 11","Cell 12","Cell 13","Cell 14","Cell 15","Cell 16"]


    override func viewDidLoad() {
        super.viewDidLoad()
        navBar.backgroundColor = UIColor.green
        executeOnce = true
        viewY = view.frame.origin.y
        viewX = view.frame.origin.x
        viewWidth = view.frame.width
        viewHeight = view.frame.height
    }



    func configureCollectionView () {
        if executeOnce {
            executeOnce = false
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.scrollDirection = .horizontal
            layout.sectionInset = UIEdgeInsets(top: 0,left: 0,right: 10)
            layout.itemSize = CGSize(width: cellWidth,height: cellHeight)

            let colWidth = viewWidth - leftGap - rightGap
            let colX = viewX + leftGap
            let colY = viewY + navBarHeight
            let colHeight = CGFloat(64)
            let frame = CGRect(x:colX,y:colY,width: colWidth,height: colHeight)
            //let frame = CGRect.zero
            collectionContainerView = UICollectionView (frame: frame,collectionViewLayout: layout)
            collectionContainerView.dataSource = self
            collectionContainerView.delegate = self
            collectionContainerView.autoresizingMask = [.flexibleLeftMargin,.flexibleLeftMargin,.flexibleBottomMargin,.flexibleRightMargin,.flexibleHeight,.flexibleWidth]
            collectionContainerView.register(UICollectionViewCell.self,forCellWithReuseIdentifier: "collectionCell")
            collectionContainerView.backgroundColor = UIColor.blue
            collectionContainerView.allowsSelection = true
            collectionContainerView.isScrollEnabled = true
            collectionContainerView.setNeedsDisplay()
            print("collectionContainerView.frame (collectionContainerView.frame)")
            view.addSubview(collectionContainerView)
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        configureCollectionView()
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
        print("headerLabels.count (headerLabels.count)")
        return  headerLabels.count
    }



    func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell",for: indexPath as IndexPath)

        for v in cell.subviews {
            v.removeFromSuperview()
        }

        let cellTitle = headerLabels[indexPath.row]
        let cellTitleLines = cellTitle.components(separatedBy: " ")
        let nLabels = cellTitleLines.count

        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 8
        let labelHeight = cellHeight / cellTitleLines.count
        for i in (0 ..< nLabels) {
            let frame = CGRect(x: 0,y: labelHeight * i,width: cellWidth,height: labelHeight)
            let label1 = UILabel(frame: frame)
            cell.backgroundColor = UIColor.lightGray
            label1.numberOfLines = 1
            label1.text = headerLabels[indexPath.row]
            label1.textAlignment = .center
            label1.textColor = UIColor.black
            label1.clipsToBounds = true
            label1.adjustsFontSizeToFitWidth = true
            label1.text = cellTitleLines[i]
            cell.addSubview(label1)
        }

        return cell
    }

    func collectionView(_ collectionView: UICollectionView,shouldSelectItemAt indexPath: IndexPath) -> Bool {
        collectionContainerView.scrollToItem(at:IndexPath(item: indexPath.item,section: 0),at: .centeredHorizontally,animated: false)

        return true
    }

    func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
        let cell = collectionContainerView.cellForItem(at: indexPath)
        print("cell = (cell)")
        collectionContainerView.scrollToItem(at:IndexPath(item: indexPath.item,animated: false)
    }


    func collectionView(_ collectionView: UICollectionView,shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }


    func collectionView(_ collectionView: UICollectionView,didHighlightItemAt indexPath: IndexPath) {
    }



    override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读