Реализация UIStackView внутри UICollectionViewCell - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь отобразить оценки пользователей на collectionview следующим образом с использованием двух изображений, half.png и full.png.

Но хотя я и жестко запрограммировал 1 star для тестирования, но иногда во время прокрутки он показывает больше 1 star. Это продолжает увеличиваться.

Интересно, как решить эту проблему?

CollectionViewCell

import UIKit

class CollectionCell: UICollectionViewCell {

    @IBOutlet var ratingView: UIStackView!

    var rating : Float!
    {
       didSet {
           self.ratingView.addArrangedSubview(addRating())
      }
    }

    func addRating() -> UIStackView
    {
      let stackView = UIStackView()
      stackView.axis = .horizontal

      let oneStarImage = UIImage(named: "full_star")
      let halfStarImage = UIImage(named: "half_star")

      //hard coded        
      var value = 1.0

      while true {
        value -= 1
        if value >= 0 {
            print("Add 1 star")
            let imageView = UIImageView()
            imageView.image = oneStarImage
            stackView.addArrangedSubview(imageView)

        } else if value == -0.5 {
            print("Add half a star")
            let imageView = UIImageView()
            imageView.image = halfStarImage
            stackView.addArrangedSubview(imageView)
            break
        }
        else {
            break
        }
     }
     return stackView
   }
 }

CollectionViewController

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! CollectionViewCell
    cell.rating = 1.0
    return cell
}

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

А также вы можете использовать для повторно используемого UICollectionViewCell или UITableViewCell,

override func prepareForReuse() {
    super.prepareForReuse()
    self.ratingView = UIStackView()
}

переопределить функцию, чтобы подготовить ячейку к повторному использованию. Однако вам следует заново запустить компоненты, которым вы присваиваете значения в ячейке.

0 голосов
/ 26 июня 2018

Поскольку UICollectionViewCell используется повторно, каждый раз, когда вы устанавливаете рейтинг, в UIStackView добавляется новое представление. Поэтому вы должны сбросить UIStackView перед добавлением изображений. Кроме того, возможно, нет необходимости создавать UIStackView каждый раз, когда вы добавляете рейтинг. Вместо этого вы можете повторно использовать ratingView. Итак, полный код должен быть:

var rating : Float!
{
    didSet {
        self.addRating()
    }
}

func addRating()
{
    // Empty the ratingView first
    ratingView.arrangedSubviews.forEach { $0.removeFromSuperview() }
    let oneStarImage = UIImage(named: "full_star")
    let halfStarImage = UIImage(named: "half_star")

    //hard coded
    var value = 1.0

    while true {
        value -= 1
        if value >= 0 {
            print("Add 1 star")
            let imageView = UIImageView()
            imageView.image = oneStarImage
            ratingView.addArrangedSubview(imageView)

        } else if value == -0.5 {
            print("Add half a star")
            let imageView = UIImageView()
            imageView.image = halfStarImage
            ratingView.addArrangedSubview(imageView)
            break
        }
        else {
            break
        }
    }
}
...