我正在尝试学习如何使用UICollectionView
。 documentation有点难以理解,我发现的教程要么是在Objective C中,要么是在很复杂的项目中。
当我学习如何使用UITableView
时,我们❤Swift的 How to make a simple tableview with iOS 8 and Swift有一个非常基本的设置和解释让我开始。 UICollectionView
是否有类似的内容?
以下答案是我尝试学习这一点。
答案 0 :(得分:448)
此项目已使用Xcode 10和Swift 4.2进行测试。
它可以只是一个单一视图应用程序。
创建一个新的Cocoa Touch类文件(文件>新>文件...> iOS> Cocoa Touch类)。将其命名为MyCollectionViewCell
。此类将保留您在故事板中添加到单元格的视图的出口。
import UIKit
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var myLabel: UILabel!
}
我们稍后会连接这个插座。
打开ViewController.swift并确保您拥有以下内容:
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"]
// MARK: - UICollectionViewDataSource protocol
// tell the collection view how many cells to make
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.items.count
}
// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// get a reference to our storyboard cell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
// Use the outlet in our custom class to get a reference to the UILabel in the cell
cell.myLabel.text = self.items[indexPath.item]
cell.backgroundColor = UIColor.cyan // make cell more visible in our example project
return cell
}
// MARK: - UICollectionViewDelegate protocol
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// handle tap events
print("You selected cell #\(indexPath.item)!")
}
}
备注强>
UICollectionViewDataSource
和UICollectionViewDelegate
是集合视图遵循的协议。您还可以添加UICollectionViewFlowLayout
协议以编程方式更改视图的大小,但这不是必需的。将集合视图拖到故事板中的View Controller。如果您愿意,可以添加约束以使其填充父视图。
确保属性检查器中的默认值也是
Collection View左上角的小方框是Collection View Cell。我们将它用作我们的原型单元。将标签拖到单元格中并使其居中。您可以调整单元格边框的大小,并根据需要添加约束以使Label居中。
在“集合视图单元格”的“属性”检查器的“标识符”框中写入“单元格”(不带引号)。请注意,这与ViewController.swift中的let reuseIdentifier = "cell"
值相同。
在单元格的Identity Inspector中,将类名设置为MyCollectionViewCell
,即我们制作的自定义类。
myLabel
类中的MyCollectionViewCell
。 (你可以Control-drag。)delegate
和dataSource
挂钩到View Controller。 (右键单击“文档大纲”中的“集合视图”。然后单击并将加号箭头向上拖动到视图控制器。)这是在添加约束以使单元格中的Label居中并将Collection View固定到父级墙壁之后的样子。
上面的例子很有效但很难看。以下是您可以使用的一些内容:
背景颜色
在界面生成器中,转到集合视图>属性检查器>查看>背景即可。
单元格间距
将单元格之间的最小间距更改为较小的值会使其看起来更好。在Interface Builder中,转到集合视图>尺寸检验员>最小间距并使值更小。 “For cells”是水平距离,“For lines”是垂直距离。
细胞形状
如果您想要圆角,边框等,您可以使用单元格layer
。这是一些示例代码。您可以在cell.backgroundColor = UIColor.cyan
之后直接将其放在上面的代码中。
cell.layer.borderColor = UIColor.black.cgColor
cell.layer.borderWidth = 1
cell.layer.cornerRadius = 8
有关您可以对图层执行的其他操作(例如,阴影),请参阅this answer。
点按时更改颜色
当细胞以视觉方式响应水龙头时,它可以提供更好的用户体验。实现此目的的一种方法是在触摸单元格时更改背景颜色。为此,请将以下两种方法添加到ViewController
类:
// change background color when user touches cell
func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.red
}
// change background color back when user releases touch
func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.cyan
}
以下是更新的外观:
答案 1 :(得分:2)
UICollectionView的代理和数据源
//MARK: UICollectionViewDataSource
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1 //return number of sections in collection view
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10 //return number of rows in section
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("collectionCell", forIndexPath: indexPath)
configureCell(cell, forItemAtIndexPath: indexPath)
return cell //return your cell
}
func configureCell(cell: UICollectionViewCell, forItemAtIndexPath: NSIndexPath) {
cell.backgroundColor = UIColor.blackColor()
//Customise your cell
}
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let view = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "collectionCell", forIndexPath: indexPath) as UICollectionReusableView
return view
}
//MARK: UICollectionViewDelegate
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
// When user selects the cell
}
override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
// When user deselects the cell
}
答案 2 :(得分:2)
对于swift 4.2
-
//MARK: UICollectionViewDataSource
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1 //return number of sections in collection view
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10 //return number of rows in section
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath)
configureCell(cell: cell, forItemAtIndexPath: indexPath)
return cell //return your cell
}
func configureCell(cell: UICollectionViewCell, forItemAtIndexPath: NSIndexPath) {
cell.backgroundColor = UIColor.black
//Customise your cell
}
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let view = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "collectionCell", for: indexPath as IndexPath) as UICollectionReusableView
return view
}
//MARK: UICollectionViewDelegate
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
// When user selects the cell
}
func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
// When user deselects the cell
}
答案 3 :(得分:1)
UICollectionView实现非常有趣。 您可以使用简单的源代码,并使用以下链接观看视频教程:
https://github.com/Ady901/Demo02CollectionView.git
https://www.youtube.com/watch?v=5SrgvZF67Yw
extension ViewController : UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return nameArr.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DummyCollectionCell", for: indexPath) as! DummyCollectionCell
cell.titleLabel.text = nameArr[indexPath.row]
cell.userImageView.backgroundColor = .blue
return cell
}
}
extension ViewController : UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let alert = UIAlertController(title: "Hi", message: "\(nameArr[indexPath.row])", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}
}
答案 4 :(得分:0)
UICollectionView与UITableView相同,但它为我们提供了简单创建网格视图的附加功能,这在UITableView中有点问题。这将是一个非常长的帖子,我提到了link,您可以通过简单的步骤获得所有内容。