Кнопка в CollectionView не отображается - PullRequest
0 голосов
/ 25 мая 2020

Я хочу создать кнопку в своей ячейке CollectionView. Но этого не происходит. Мои ограничения верны?

Это мой код:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    if let vc = cell.viewWithTag(111) {
       vc.backgroundColor = Colors[indexPath.row]
    }

    let nextButton = UIButton()
    nextButton.translatesAutoresizingMaskIntoConstraints = false
    nextButton.setImage(UIImage(systemName: "gear"), for: .normal)
    nextButton.tintColor = UIColor.black
    nextButton.addTarget(self, action: #selector(editButtonTapped), for: .touchUpInside)
    nextButton.heightAnchor.constraint(equalToConstant: 100).isActive = true
    nextButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
    view.addSubview(nextButton)
    nextButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
    nextButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 100).isActive = true


    return cell
}

@IBAction func editButtonTapped() -> Void {
    print("Hello Edit Button")
}

Ответы [ 3 ]

0 голосов
/ 25 мая 2020

Вместо просмотра добавьте его в contentView ...

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        if let vc = cell.viewWithTag(111) {
           vc.backgroundColor = Colors[indexPath.row]
        }

        let nextButton = UIButton()
        nextButton.translatesAutoresizingMaskIntoConstraints = false
        nextButton.setImage(UIImage(systemName: "gear"), for: .normal)
        nextButton.tintColor = UIColor.black
        nextButton.addTarget(self, action: #selector(editButtonTapped), for: .touchUpInside)
        nextButton.heightAnchor.constraint(equalToConstant: 100).isActive = true
        nextButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
        cell.contentView.addSubview(nextButton)
        nextButton.centerXAnchor.constraint(equalTo: cell.contentView.centerXAnchor).isActive = true
        nextButton.bottomAnchor.constraint(equalTo: cell.contentView.bottomAnchor, constant: 100).isActive = true


        return cell
    }

Но это не лучший подход для добавления кнопки в cellForRow ... у вас должен быть собственный класс ячейки .. Добавьте эту кнопку в пользовательский метод инициализации класса

0 голосов
/ 26 мая 2020

Кажется, вы добавляете кнопку к UIViewController view вместо cell. Я внес исправления и заставил ваш код работать на Xcode-игровой площадке. Я выложу его здесь, опробую на вашей игровой площадке и лично проверю, как это работает.

import UIKit
import PlaygroundSupport

class ViewController: UICollectionViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        30
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        cell.backgroundColor = .red

        let nextButton = UIButton()
        nextButton.translatesAutoresizingMaskIntoConstraints = false
        nextButton.setImage(UIImage(systemName: "gear"), for: .normal)
        nextButton.tintColor = UIColor.black
        nextButton.addTarget(self, action: #selector(editButtonTapped), for: .touchUpInside)
        nextButton.heightAnchor.constraint(equalToConstant: 100).isActive = true
        nextButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
        cell.addSubview(nextButton)
        nextButton.centerXAnchor.constraint(equalTo: cell.centerXAnchor).isActive = true
        nextButton.bottomAnchor.constraint(equalTo: cell.bottomAnchor).isActive = true

        return cell
    }

    @IBAction func editButtonTapped() -> Void {
        print("Hello Edit Button")
    }

}

let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: 150, height: 150)
PlaygroundPage.current.setLiveView(ViewController(collectionViewLayout: layout))
PlaygroundPage.current.needsIndefiniteExecution = true
0 голосов
/ 25 мая 2020

Почему ты это делаешь? Просто добавить через раскадровку? CellForRowAt будет вызываться несколько раз и несколько раз добавлять кнопку и ограничения (возможно, почему это не работает). Если вы все делаете программно, вам следует подумать о добавлении ограничений в методе init.

Я не могу найти ничего плохого в ограничениях. Просто попробуйте изменить место, где вы их добавляете.

Дополнительно для отладки макета представления рассмотрите возможность использования Debug View Hierarchy в Xcode, чтобы увидеть, правильно ли добавляется кнопка.

...