如何将标签添加到收藏夹视图

时间:2019-10-16 00:36:07

标签: ios swift uicollectionview label constraints

如果用户个人资料上没有帖子,我想显示标签。我在此处复制了一个答案的代码段

   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()
    }

这是我的意思的两个屏幕截图。第一张照片是我希望标签保留的位置。

enter image description here

第二张照片,如您所见,当我下拉刷新时,标签将不会留在原地。它有点与标题。这是因为我已将消息设置为与背景视图分开吗? enter image description here

4 个答案:

答案 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()
}