集合视图 Header 可重用视图
CollectionView Header ReusableView
我通过故事板在collectionView中启用了header,然后我编码如下,但是Header没有出现。我想知道有人看到任何问题吗?
AskViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
askCollectionView.register(AskCollectionViewHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "askCollectionViewHeader")
askCollectionView.delegate = self
askCollectionView.dataSource = self
}
extension AskViewController : UICollectionViewDelegateFlowLayout, UICollectionViewDataSource
{
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "askCollectionViewHeader", for: indexPath) as! AskCollectionViewHeader
header.askHeaderTitle.text = "Hi"
return header
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
referenceSizeForHeaderInSection section: Int) -> CGSize{
return CGSize(width: view.frame.size.width, height: 200)
}
}
AskCollectionViewHeader.swift
import UIKit
class AskCollectionViewHeader : UICollectionReusableView {
@IBOutlet weak var askHeaderTitle: UILabel!
}
您正在注册 class,但没有任何实例化此视图的 askHeaderTitle
。
使用 collection 视图 headers,您有三个选择:
定义故事板场景中的可重用视图(通过将“Collection 可重用视图”拖到您在 Interface Builder 中设置的 collection 视图上)。在那种情况下,您将在 IB 中指定 class 和重用标识符,并且根本不会在 viewDidLoad
中调用 register
,而是让情节提要来处理.
在 NIB 中定义可重用视图。在那种情况下,您将在 IB 中注册 NIB,而不是 class.
以编程方式定义可重用视图。只有在那种情况下,您才会将 register
与 class 一起使用。但是话又说回来,subclass 不会使用 @IBOutlet
(因为您没有在 IB 中定义它),并且您将以编程方式创建子视图。
我认为选项 1 最简单,但显然仅当您使用故事板和单元格原型时才适用。如果您计划从多个视图控制器使用一些可重用视图,则选项 2 很有用。如果您想手动完成所有操作,选项 3 是一种可能采用的技术。
我通过故事板在collectionView中启用了header,然后我编码如下,但是Header没有出现。我想知道有人看到任何问题吗?
AskViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
askCollectionView.register(AskCollectionViewHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "askCollectionViewHeader")
askCollectionView.delegate = self
askCollectionView.dataSource = self
}
extension AskViewController : UICollectionViewDelegateFlowLayout, UICollectionViewDataSource
{
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "askCollectionViewHeader", for: indexPath) as! AskCollectionViewHeader
header.askHeaderTitle.text = "Hi"
return header
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
referenceSizeForHeaderInSection section: Int) -> CGSize{
return CGSize(width: view.frame.size.width, height: 200)
}
}
AskCollectionViewHeader.swift
import UIKit
class AskCollectionViewHeader : UICollectionReusableView {
@IBOutlet weak var askHeaderTitle: UILabel!
}
您正在注册 class,但没有任何实例化此视图的 askHeaderTitle
。
使用 collection 视图 headers,您有三个选择:
定义故事板场景中的可重用视图(通过将“Collection 可重用视图”拖到您在 Interface Builder 中设置的 collection 视图上)。在那种情况下,您将在 IB 中指定 class 和重用标识符,并且根本不会在
viewDidLoad
中调用register
,而是让情节提要来处理.在 NIB 中定义可重用视图。在那种情况下,您将在 IB 中注册 NIB,而不是 class.
以编程方式定义可重用视图。只有在那种情况下,您才会将
register
与 class 一起使用。但是话又说回来,subclass 不会使用@IBOutlet
(因为您没有在 IB 中定义它),并且您将以编程方式创建子视图。
我认为选项 1 最简单,但显然仅当您使用故事板和单元格原型时才适用。如果您计划从多个视图控制器使用一些可重用视图,则选项 2 很有用。如果您想手动完成所有操作,选项 3 是一种可能采用的技术。