每个自定义单元格和自定义高度
custom cell and custom height for each
我通过开关函数输出了 4 个自定义单元格,现在我需要为每个单元格输出动态高度值或固定高度值。我都喜欢,因为它们的高度总是静态的。
我订阅了 uiСollectionviewВelegateFlowLayout
协议并找到了如何更改所有单元格的高度
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
let size = CGSize(width: 357, height: 600)
return size
为了覆盖单个单元格的高度,我使用函数
cell.frame = CGRect(cell.frame.origin.x, cell.frame.origin.y, width: 100.0, height: 100.0)
但是不行,"Expression type '@lvalue CGRect' is ambiguous without more context"
遇到这种情况我该怎么办?使用什么功能?
完整代码如下
// main protocols UICollectionView
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
// width and height for cell in collectionView
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
let size = CGSize(width: 357, height: 600)
return size
}
//margins for cell in collectionView
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 40.0
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 4
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell: UICollectionViewCell!
switch indexPath.row {
case 1:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "secondCell", for: indexPath)
as? secondCollectionViewCell
cell.frame = CGRect(cell.frame.origin.x, cell.frame.origin.y, width: 100.0, height: 100.0)
case 2:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "thirdCell", for: indexPath)
as? cellThirdCollectionViewCell
case 3:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "fourthCell", for: indexPath)
as? fourthCollectionViewCell
default:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath)
as? imageModelCollectionViewCell
}
return cell
}
}
您可以使用高度数组并根据 indexPath 检索单元格高度。
let heightArray = [90,400,100,70]
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 357, height: heightArray[indexPath.row])
}
extension ViewController : UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
switch indexPath.row {
case 1:
return CGSize(width: 100, height: 200)
case 2:
return CGSize(width: 100, height: 300)
case 3:
return CGSize(width: 100, height: 400)
default:
return CGSize(width: 100, height: 100)
}
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell: UICollectionViewCell!
switch indexPath.row {
case 1:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "firstCell", for: indexPath)
as? firstCollectionViewCell
case 2:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "secondCell", for: indexPath)
as? secondCollectionViewCell
case 3:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "thirdCell", for: indexPath)
as? thirdCollectionViewCell
default:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath)
as? imageModelCollectionViewCell
}
return cell
}
}
彻底解决问题
不要忘记添加
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
}
p.s。如果您遇到“collectionView.delegate = self
”错误,可能是因为您在 viewController
而不是 collectionViewController
中工作
您需要添加IBOutlet
您是否尝试过将您的函数 func collectionView(_:layout:sizeForItemAt:)
更改为这样的东西?
let cellHeights = [ 90, 400, 100, 70 ]
// width and height for cell in collectionView
func collectionView( _ view: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath ) -> CGSize
{
return CGSize(
width: view.bounds.size.width,
height: cellHeights[indexPath.row]
)
}
此外,将 collectionView.dequeueReusableCell(withReuseIdentifier:for:)
的结果转换为 UICollectionViewCell
子类对您的代码没有影响...
我可能会将其更改为:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
// map row numbers to cell reuse identifiers...
let ids = [
0: "secondCell",
1: "thirdCell",
2: "fourthCell"
]
// look up the reuse identifier for the row we want; if none found (subscript call returns `nil`), use `"imageCell"`
let reuseID = ids[indexPath.row] ?? "imageCell"
let cell = collectionView.dequeueReusableCell( withReuseIdentifier: reuseID, for: indexPath)
return cell
}
我通过开关函数输出了 4 个自定义单元格,现在我需要为每个单元格输出动态高度值或固定高度值。我都喜欢,因为它们的高度总是静态的。
我订阅了 uiСollectionviewВelegateFlowLayout
协议并找到了如何更改所有单元格的高度
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
let size = CGSize(width: 357, height: 600)
return size
为了覆盖单个单元格的高度,我使用函数
cell.frame = CGRect(cell.frame.origin.x, cell.frame.origin.y, width: 100.0, height: 100.0)
但是不行,"Expression type '@lvalue CGRect' is ambiguous without more context"
遇到这种情况我该怎么办?使用什么功能?
完整代码如下
// main protocols UICollectionView
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
// width and height for cell in collectionView
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
let size = CGSize(width: 357, height: 600)
return size
}
//margins for cell in collectionView
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 40.0
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 4
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell: UICollectionViewCell!
switch indexPath.row {
case 1:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "secondCell", for: indexPath)
as? secondCollectionViewCell
cell.frame = CGRect(cell.frame.origin.x, cell.frame.origin.y, width: 100.0, height: 100.0)
case 2:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "thirdCell", for: indexPath)
as? cellThirdCollectionViewCell
case 3:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "fourthCell", for: indexPath)
as? fourthCollectionViewCell
default:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath)
as? imageModelCollectionViewCell
}
return cell
}
}
您可以使用高度数组并根据 indexPath 检索单元格高度。
let heightArray = [90,400,100,70]
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 357, height: heightArray[indexPath.row])
}
extension ViewController : UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
switch indexPath.row {
case 1:
return CGSize(width: 100, height: 200)
case 2:
return CGSize(width: 100, height: 300)
case 3:
return CGSize(width: 100, height: 400)
default:
return CGSize(width: 100, height: 100)
}
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell: UICollectionViewCell!
switch indexPath.row {
case 1:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "firstCell", for: indexPath)
as? firstCollectionViewCell
case 2:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "secondCell", for: indexPath)
as? secondCollectionViewCell
case 3:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "thirdCell", for: indexPath)
as? thirdCollectionViewCell
default:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath)
as? imageModelCollectionViewCell
}
return cell
}
}
彻底解决问题 不要忘记添加
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
}
p.s。如果您遇到“collectionView.delegate = self
”错误,可能是因为您在 viewController
而不是 collectionViewController
您需要添加IBOutlet
您是否尝试过将您的函数 func collectionView(_:layout:sizeForItemAt:)
更改为这样的东西?
let cellHeights = [ 90, 400, 100, 70 ]
// width and height for cell in collectionView
func collectionView( _ view: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath ) -> CGSize
{
return CGSize(
width: view.bounds.size.width,
height: cellHeights[indexPath.row]
)
}
此外,将 collectionView.dequeueReusableCell(withReuseIdentifier:for:)
的结果转换为 UICollectionViewCell
子类对您的代码没有影响...
我可能会将其更改为:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
// map row numbers to cell reuse identifiers...
let ids = [
0: "secondCell",
1: "thirdCell",
2: "fourthCell"
]
// look up the reuse identifier for the row we want; if none found (subscript call returns `nil`), use `"imageCell"`
let reuseID = ids[indexPath.row] ?? "imageCell"
let cell = collectionView.dequeueReusableCell( withReuseIdentifier: reuseID, for: indexPath)
return cell
}