如果用户个人资料上没有帖子,我想显示标签。我在此处复制了一个答案的代码段
func setEmptyMessage(_ message: String) {
let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 30))
messageLabel.text = message
messageLabel.textColor = .black
messageLabel.numberOfLines = 0
messageLabel.textAlignment = .center
messageLabel.font = UIFont.systemFont(ofSize: 17, weight: .regular)
messageLabel.sizeToFit()
messageLabel.clipsToBounds = true
self.collectionView.backgroundView = messageLabel
}
func restore() {
self.collectionView.backgroundView = nil
}
使用中
// Return users uploaded posts
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if posts.count == 0 {
self.setEmptyMessage("No Posts")
} else {
self.restore()
}
return posts.count
}
代码效果很好,需要时会显示标签。唯一的问题是我有一个集合视图标头,当我下拉刷新标头与标签混合的视图时。当我下拉刷新时如何隐藏标签或以某种方式在节标题下赋予固定的约束?不知道在下拉时刷新标签是否会更好,但我不知道如何获取emptyMessage的代码并将其与handleRefresh代码合并。.
@objc func handleRefresh() {
posts.removeAll(keepingCapacity: false)
self.currentKey = nil
fetchPosts()
collectionView?.reloadData()
}
这是我的意思的两个屏幕截图。第一张照片是我希望标签保留的位置。
答案 0 :(得分:0)
对不起,您添加了屏幕截图,我明白您的意思了。
backgroundView不会跟随滚动,因此不会获得想要的效果。
我建议您添加一个新的单元格类型,该单元格可用作提示标记,大概是这样
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return posts.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if something { // Replace with your judgment logic
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NoPostCollectionViewCell", for: indexPath) as! CollectionViewCell
cell.label.text = "No Posts"
return cell
}
let post = posts[indexPath.row]
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
cell.label.text = title
return cell
}
这里的判断不再使用posts.count == 0
,它可能永远不会输入cellForItemAt
这时候我建议您有两个数据结构,一个普通数据,可能是一个数组。另一个仅包含一个字符串的数组,主要显示No Posts
。判断条件可以根据数据类型判断
答案 1 :(得分:0)
我将创建一个empltyCell来显示帖子为空的情况:
对于项目数:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if posts.count == 0 {
return 1
} else {
return.posts.count
}
}
对于索引路径处的项目:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard !posts.isEmpty else {
let emptyCell = collectionView.dequeueReusableCell(withReuseIdentifier: "emptyCell", for: indexPath) as! EmptyCell
return emptyCell
}
//... rest of your cellForItemAt code here
}
下面的单元格类定义:
class EmptyCell:UICollectionViewCell {
let label = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
label.text = "No Posts yet"
label.textAlignment = .center
addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
backgroundColor = .clear
}
required init?(coder: NSCoder) {
fatalError()
}
}
也不要忘记在viewDidLoad()中为collectionView注册该单元格:
self.collectionView!.register(EmptyCell.self, forCellWithReuseIdentifier: "emptyCell")
答案 2 :(得分:0)
您只需要向0添加前导约束和尾随约束即可,
lable.addConstraint(NSLayoutConstraint(item: mainView, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1, constant: 0))
lable.addConstraint(NSLayoutConstraint(item: mainView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 0))
,然后将标签的对齐方式设置为居中,例如:
label.textAlignment = .center;
您将得到结果。
答案 3 :(得分:0)
var messageLabel: UILabel?
func setEmptyMessage(_ message: String) {
let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width:view.frame.width, height: 30))
messageLabel?.text = message
messageLabel?.textColor = .black
messageLabel?.numberOfLines = 0
messageLabel?.textAlignment = .center
messageLabel?.font = UIFont.systemFont(ofSize: 17, weight: .regular)
messageLabel?.sizeToFit()
messageLabel?.clipsToBounds = true
if let messageLabel = messageLabel {
self.collectionView.backgroundView.addSubview(messageLabel)
messageLabel.centerYAnchor.constraint(..collectionView.centerYAnchor).isActive = true
messageLabel.leadingAnchor.constraint(..collectionView.leadingAnchor).isActive = true
messageLabel.trailingAnchor.constraint(..collectionView.trailingAnchor).isActive = true
}
}
func restore() {
messageLabel?.removeFromSuperView()
}