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?) { } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 批量导入xml到informatica repository中的shell script
- crtmpserver系列(二):搭建简易流媒体直播系统
- WebLogic任意文件上传漏洞复现与分析 -【CVE-2018-2894 】
- “约定优于配置”与Magento改造尝试二之布局xml文件加载
- ruby-on-rails – Rails路由的未初始化常量问题
- ASP分页是计算页面总数的方法
- 正则表达式题
- iphone – 如何使用最新的Xcode下载来修复旧的iOS版本?
- React native login, signup and navigation 风格二
- c# – 旋转设备后如何保存/重新绑定MapFragment上的事件侦听