Метод draw () UICollectionViewCell не вызывается после перезагрузки данных - PullRequest
0 голосов
/ 17 января 2019

Я использую UICollectionView в своем проекте, но он не рисует ячейки для повторно используемых. Думаю, что у меня 20 ячеек, когда приложение открыто, метод рисования вызывается 20 раз. Затем я изменяю количество ячеек на 30 и перезагружаю CollectionView, затем метод draw вызывается только 10 раз. Я хочу вызвать метод draw 30 раз, потому что я делаю некоторые операции (добавление изображений) в этом методе в ячейку.

Примечание : я тестировал в iphone 5s (ios 10.3.3)

Ниже класс GameCollectionViewCell используется в качестве пользовательской ячейки для CollectionView

extension GameCollectionViewCell {

    override func draw(_ rect: CGRect) {

                var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))

                var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
                var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
                var princessRect : CGRect = CGRect(origin: origin, size: size)

                princess.frame = princessRect
                princess.layer.masksToBounds =  true
                princess.layer.cornerRadius = 2;

                contentView.addSubview(princess)

            }
        }

Ответы [ 3 ]

0 голосов
/ 18 января 2019

У меня была такая же проблема с моим представлением коллекции, лучшее решение - добавить функциональность в ваш GameCollectionViewCell скажем updateView() и добавить элементы пользовательского интерфейса в подпредставление

func updateView() {
    var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))

            var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
            var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
            var princessRect : CGRect = CGRect(origin: origin, size: size)

            princess.frame = princessRect
            princess.layer.masksToBounds =  true
            princess.layer.cornerRadius = 2;

            addSubview(princess)
}

А внутри viewcontroller при создании ячейки для indexpath вызовите вышеуказанный метод

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! GameCollectionViewCell
    cell.updateView()       
    return cell
}
0 голосов
/ 18 января 2019

Большое спасибо @RobertDresler. Он спас мой день. После перезагрузки CollectionView, если вы вызовете метод setNeedsDisplay (), будет вызван метод draw (). Проверьте ниже.

override func prepareForReuse() {

        super.prepareForReuse()
        setNeedsDisplay()

    }
0 голосов
/ 17 января 2019

Это правда, что вы не должны переопределять метод в расширении, точно так же, как то, что вы делаете в методах lifeCycle ваших контроллеров (например, viewDidLoad(). Также обратите внимание, что в большинстве случаев вы должны вызывать его super.someFunc()Вместо этого создайте подкласс.

При добавлении подпредставлений в подкласс UICollectionViewCell поместите свои коды в метод init:

override init(frame: CGRect) {
    super.init(frame: frame)
}

Если вы хотите что-либо изменить в слое своего представления,Вы можете переопределить layoutSubviews():

override func layoutSubviews() {
        super.layoutSubviews()

}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...